14/12/20 00:24:39.20 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 を使う事を学ぶようになる
・関数プログラミングの楽しみ
URLリンク(www.amazon.co.jp)
第3章「おりがみプログラミング」で詳しく解説されています
ということで Haskell の定義を参考にして、SML でも関数 unfoldl で再帰を抽象化したコードを書きました:
URLリンク(ideone.com)
ここで unfold とは、よく知られている fold の双対な概念です
(fold は、Ruby だと inject、Lisp や JavaScript では reduce と呼ばれています)
fold xs が「あるリスト xs を畳んだ値 y」を返すのに対し、
unfold y は「ある値 y を広げたリスト xs」を返します
なお、「畳む/広げる」という言葉よりも「分解する(destruct)/組立てる(construct)」のほうが直感的かもしれません
(* 長いので、続く *)