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

|