Swiftにおける関数型のエッセンスを学ぶために「関数プログラミング実践入門」を読み始めた

公開日: : 最終更新日:2016/02/10 iPhoneアプリ開発

20150805-182005.jpg

Swiftの関数型言語的な特徴についての話を各所で見るようになりましたが、自分は関数型言語の経験があまりありません。

「一度関数型言語について学んでおいたほうが良いのでは?」と思い、「関数プログラミング実践入門」という本を読み始めました。

    

Haskellには「2引数関数」というべきものがない

まだ途中までしか読んでいないのですが、いまのところ一番衝撃を受けたのは、「Haskellには厳密には2引数関数というべきものがない」という点です。

例えば、Haskellには論理積を求めるための関数「&&」があります。この関数を普通に使うと、

Prelude> (&&) True True   -- TrueとTrueを渡す
True                      -- 結果はTrue
Prelude> (&&) True False  -- TrueとFalseを渡す
False                     -- 結果はFalse
Prelude> (&&) False True  -- FalseとTrueを渡す
False                     -- 結果はFalse
Prelude> (&&) False False -- FalseとFalseを渡す
False                     -- 結果はFalse

となりますが、これは実際には、まず1つ目の引数を渡して1引数の関数を作り、その関数に2つ目の引数を渡しています。

Prelude> let andT = (&&) True -- 1つだけ真偽値を与えて、andTという関数を作る
Prelude> :t andT              -- andTの型を調べる
andT :: Bool -> Bool          -- andTは、Boolを1つ受け取り、Boolを1つ返す関数
Prelude> andT True            -- andTにTrueを1つ渡す
True                          -- 結果はTrue(TrueとTrueの論理積)
Prelude> andT False           -- andTにFalseを1つ渡す
False                         -- 結果はFalse(TrueとFalseの論理積)

これと同じことをSwiftで書いてみると、以下のようになるのかなと思います。

// Boolを1つ受け取り、「Boolを1つ受け取って、Boolを1つ返す関数」を返す関数
func and(a:Bool) -> Bool -> Bool {
    return {b in a && b} // 「Boolを1つ受け取って、Boolを1つ返す関数」を返す
}

let f1 = and(true)  // trueを渡し、関数を作る
f1(true)            // 関数にtrueを渡す(結果はtrue)
f1(false)           // 関数にfalseを渡す(結果はfalse)

let f2 = and(false) // falseを渡し、関数を作る
f2(true)            // 関数にtrueを渡す(結果はfalse)
f2(false)           // 関数にfalseを渡す(結果はfalse)

    

@akio0911はこう思った。

手続き型言語ばかり触ってきたので、次々と出てくる概念が目新しくてとても面白いです。

この本を1冊読み終わった時点で、Swiftがどのような言語として見えるようになるのかがとても楽しみです。

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

PAGE TOP ↑