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

関連記事

I20160129-115948.jpg

【対処法】Swift 2(iOS 9)ではUITextFieldのtextがString?になっている

Swift 1(iOS 8)時代において、UITextFieldのtextプロパティは va

記事を読む

20141031-150402.jpg

アップルのベータテストサービス「TestFlight」が正式公開

アップルが先週の木曜、ベータテストサービス「TestFlight」を正式に公開しました。 Te

記事を読む

I20150802-085831.jpg

Swift 1.2でtouchesBeganメソッドのNSSetがSetへ変更されました

Swift 1.2で、touchesBegan・touchesMoved・touchesCanc

記事を読む

I20151201-120520.jpg

【Swift 2】switch内にてguardでbreakする

Swift 2のguard内ではreturnしないと文法エラーとなりますが、実はswitch

記事を読む

20150327-131839.jpg

【Apple Watchアプリ】ボタン内の文字の先頭に画像を入れる方法【WatchKit】

Apple Watch向けのアプリを作るためのフレームワーク「WatchKit」。そのWatch

記事を読む

I20151031-175009.jpg

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

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

記事を読む

I20160918-133158.jpg

StoryboardでChild View Controllerにデータを渡す方法(Xcode 8 & Swift 3)

Storyboardで、Child View Controllerにデータを渡す方法を紹介します

記事を読む

I20150724-135442.jpg

iPhoneのホーム1画面目に置いているオススメなアプリ38本(2015年9月版)

2014年7月に「iPhoneアプリ開発にオススメの本10選(2014年7月版)」という記事

記事を読む

20150522-105524.jpg

【書籍】初心者にオススメな本!「これからはじめる Apple Watchアプリ開発入門」

Apple Watchは買いましたか?使ってますか?アプリを作ってみたくはないですか? という

記事を読む

20140905-180905.jpg

英語苦手な人がSwiftを学びたいならこの本を読むといいよ!

アップルのWWDC2014で発表された、iOSおよびOS Xのためのプログラミング言語「Swift」

記事を読む

【Mac】macOSのメール(Mail.app)でGmailをサクサク快適に使う方法

macOSに搭載されているメールアプリ、いわゆるMail.ap

【メンズネイル】新宿区大久保のネイルサロンで紫とピンクのネイルにしてもらった

2016年11月12日、東京都新宿区大久保にあるネイルサロン「

[Xcode][Swift]ボタンなどの同時タップを禁止する

iOSで、ボタンなどの同時タップを禁止する方法を紹介します。

【HomeKit】家の照明をSiriで制御できるようにしてみた

Apple製品と家電を連携するシステム「HomeKit(ホーム

【メンズネイル】新宿区大久保のサロンでターコイズとピンクのメタルネイルにしてもらった

2016年10月22日、いつもお世話になっているネイルサロン「

→もっと見る

PAGE TOP ↑