読者です 読者をやめる 読者になる 読者になる

これが最後じゃないからね

iOS開発 / Swiftなどの技術を中心に

関数のカリー化と部分適用がなんとなーくわかってきた

3ヶ月前ぐらいに「詳解SwiftのCHAPTER 13 クロージャ」の章の「関数のカリー化と部分適用」が
は?って感じだったのですが今はなんとなくですがわかってきました。
あ、はじめに言っておきますが、まだ理解途中なのであくまで自分の現在の理解ではって感じです

「整数x, y, zを足し算して返す関数」

Swiftで実装 f:id:haptaro:20160518212630p:plain

Haskellだと f:id:haptaro:20160518210850p:plain

Haskellめっちゃ簡潔ですね! ただSwiftでreturnがあったほうが仕組みの理解はコードでできるかもしれませんね。

やっていること

x, y, z(Int型の変数を3つ)受け取って、Int型の値を返す

やり方

  1. x(Int型の変数1つ)を受け取って、Int型の変数を2つ受け取ってInt型の値を返す関数をクロージャで返す
  2. y(Int型の変数1つ)を受け取って、Int型の変数を1つ受け取ってInt型の値を返す関数をクロージャで返す
  3. z(Int型の変数1つ)を受け取って、x, y, z(今までの変数)を足した値を返す

そして恥ずかしながらこれを書いてみてはじめて「クロージャ内部に変数(結果)を持たせる」感覚がわかった。

カリー化関数は何が良いのか?

カリー化をすることによって、「関数を本来より少ない引数で呼び出したときに部分適用された関数が得られること」で「新しい関数を作ることができる」からです。
※すごいHaskellたのしく学ぼう!からの引用

今回の例で見てみますと f:id:haptaro:20160518214735j:plain ただまだ正直部分適用された関数をどのように使うかは計算的な例しか理解していないので、今後調べていきたいですね。

まぁHaskellガチ勢、関数型プログラミングガチ勢の人からしたらなめんなよ!って感じかもしれませんが自分的には意外と感動!笑
むしろマサカリ投げられて手とり足とり教えて欲しい。。。

そしてターミナルとかで勉強していても良いのだが、効率を上げるためにお試しで買ってしまった...

正直高いけど、...まぁー投資だと思って。
お金ないです笑

Swift 3.0では

カリー化関数宣言構文が削除されます。 Swift 2.2現在では f:id:haptaro:20160518212848p:plain

というように書けますが、warningがあるように f:id:haptaro:20160518213039p:plain

怒られます。

関数型プログラミング初心者として思うことは普通に面白いですね!
また自分は理系なのでHaskell再帰関数定義が漸化式のように見えたり、集合の内包的記法なども出てきて数学との関連性が見えてくるもの面白いです