Swiftにおける関数型のエッセンスを学ぶために「関数プログラミング実践入門」を読み始めた
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
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がどのような言語として見えるようになるのかがとても楽しみです。
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!