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コード)

関連記事

20160724-154909.jpg

デザインの素人がノンデザイナーズ・デザインブックを読んだら、デザインの原則が結構分かるようになった!

ずっとエンジニアとして働いてきてデザインに関してはまったくの素人な僕ですが、「ノンデザイナーズ・

記事を読む

I20151126-170621.jpg

Swift 2のprintで改行しない方法

Swift 1時代はprintlnで改行あり、printで改行なしでしたが、Swift 2ではp

記事を読む

I20150720-150147.jpg

Apple Watchアプリを作りたいならこの書籍!「詳細!Apple Watch アプリ開発 入門ノート」

     Apple Watchアプリの作り方を学ぶのにオススメな書籍、「詳細!Apple W

記事を読む

20150104-120413.jpg

【おすすめ本】Swiftではじめる iPhoneアプリ開発の教科書【iOS 8&Xcode 6対応】

     入門者にオススメな、Swift&Xcode 6の入門書「Swiftではじめる

記事を読む

I20151202-232710.jpg

【Swift 2】配列(Array)を初期化する方法

Swiftで配列(Array)を初期化する方法についてまとめてみたいと思います!   

記事を読む

20140810-193043.jpg

WordPressでObjective-Cのソースコードをキレイに整形して表示する方法

WordPressの記事内で、Objective-Cのソースコードをキレイに整形して表示する方法

記事を読む

20150525-224340.jpg

【Swift】クロージャをメソッドや関数の引数として渡す方法

Swiftでメソッドの引数としてクロージャを渡す方法について解説したいと思います。     

記事を読む

I20160418-235604.jpg

XcodeのStoryboardで部品を選択しやすくする2つの方法

ストーリーボード上で部品が入り組んでくると選択しづらくなってきますが、そんな状況でも部品を選択し

記事を読む

I20150721-164252.jpg

【書籍】iPhoneアプリ開発の初心者にオススメの本「詳細! Swift iPhoneアプリ開発 入門ノート」

     Swift 1.1、Xcode 6.1、iOS 8.1に対応している書籍「詳

記事を読む

I20151031-175009.jpg

初心者にオススメの本!Swiftではじめる iPhoneアプリ開発の教科書【Swift 2&Xcode 7対応】

     Xcode 7とSwift 2に対応したアプリ開発の入門書籍「Swiftでは

記事を読む

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

I20160924-123726.jpg
iPad Pro 9.7インチ SIMフリーモデルにFREETELのSIMを入れて使ってみた

今までiPad miniで使っていたFREETELのSIM

→もっと見る

PAGE TOP ↑