クロージャって何がいいの? [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2014/11/08(土) 13:11:47.84ID:6V2MLUHb
関数型言語に必ずくっついてるこれ
いらんでしょ?匿名クラスで充分でしょ
2014/12/20(土) 00:24:39.20ID:0cpPf2uS
>>314
>SMLとOCamlの関係だからこういう似たような感じになるのかな?

SML も OCaml も同じML族の一員ですから、そんな感じになるのも不思議じゃないと思いますね

>それともループを再帰に置き換えたらどうせどの言語でもこんな感じかな?

SML 以外の関数型言語は触った程度のレベルなので、以下はあくまで私見です:
・Lisp でも似た感じの再帰になる
 ただし Lisp は TCO が保証されていないから、一般的な反復処理であれば
 loop や while マクロ(または、その相当品)で手続き的なループで書く
・Scheme は TCO が言語仕様で保証されているので、普通は再帰で書く(>>302)
 また継続(call/cc)があるので、loop や while の相当品を関数として自前で定義することも可能
・Haskell の場合、初めのうちは(ML や Scheme と同様に)再帰で書く
 ただし Haskell だと文字列は文字型のリストであり、標準ライブラリの unfoldl を使う事を学ぶようになる
 ・関数プログラミングの楽しみ
  http://www.amazon.co.jp//dp/4274068056
  第3章「おりがみプログラミング」で詳しく解説されています
ということで Haskell の定義を参考にして、SML でも関数 unfoldl で再帰を抽象化したコードを書きました:
 http://ideone.com/o5JM86
ここで unfold とは、よく知られている fold の双対な概念です
(fold は、Ruby だと inject、Lisp や JavaScript では reduce と呼ばれています)
fold xs が「あるリスト xs を畳んだ値 y」を返すのに対し、
unfold y は「ある値 y を広げたリスト xs」を返します
なお、「畳む/広げる」という言葉よりも「分解する(destruct)/組立てる(construct)」のほうが直感的かもしれません

(* 長いので、続く *)
2014/12/20(土) 00:32:09.09ID:0cpPf2uS
(* >>315 の続き *)

なお、map や filter といった高階関数を一般化したものが fold であることは
よく知られていますが、ここでリストを代数(群)に見立てた圏論の視点で再構成すると:
・fold を(更に)一般化したものがカタモルフィズム(catamorphism)である
・unfold を(更に)一般化したものがアナモルフィズム(anamorphism)である
という、本質的な形でリスト処理を定義できるようになります
(モナドとは関連しない)圏論を応用したプログラミングについては、以下のプレゼンがお薦めです
・Introduction to Categorical Programming (Revised)
 http://www.slideshare.net/sakai/introduction-to-categorical-programming-revised
 p.18 の図式を使った「圏論でのリスト型の定義」が直感的です
詳細については、以下の記事で紹介されている論文(英語)が分かりやすかったです
・Haskellと圏論を学んできて、そのまとめとしてちょうどよい論文を見つけたのでメモ。
 https://plus.google.com/+OsamuNagano/posts/7cPfAQ145Yi

>それにしても関数型言語なるものを知るにつれて思うのは、....

ML や Haskell は静的型付けによる安全性と高速化を主眼に設計された言語ですから、
Ruby や Python といったスクリプト言語の置き換えには成り得ないと考えます
これに関しては、以前に別スレ「LLにおける関数型プログラミング」で説明しています
 http://peace.2ch.net/test/read.cgi/tech/1345123070/28
また ML や Haskell の強力な型推論は、データ型に関する矛盾(=バグ)が存在しないことを(実行の前に)証明しますが、
動かしては書き直す(いわゆるトライ&エラー)が一般的なスクリプトプログラミングには不向きだと考えます

(* これで終わり *)
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況