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

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

記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

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がどのような言語として見えるようになるのかがとても楽しみです。

この記事を書いた人
あきお(@akio0911
派手髪iOSエンジニア。Twitterアカウントは@akio0911。YouTubeチャンネル「あきおチャンネル」にてiOSアプリ開発講座を公開中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。iOSアプリ開発をテーマとしたオンラインサロン「アプリ道場サロン」を運営。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。

関連記事

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

Twitterで更新情報をゲット!

PAGE TOP ↑