On Sat, 08 Nov 2003 01:30:20 +0900, shelarcy 
<shelarcy / capella.freemail.ne.jp> wrote:
>> もう一つ。前の factorial のときはYコンビネータで
>> 定義した fix を使う必要があったのにこちらはシンプルな定義の
>> fix で済むのはなぜでしょうか。
>
> Strict language (like SML) do restrict reasoning in way that
> lazy languages (like Haskell) do not.
>
> ここの記述を、"正格評価用に書き直す必要がある"という風に受け取るべき
> なのかな?
> そうすると本当に再帰定義できないということになりますが……
> SML 97 以前の仕様がもしかするとそうなのかもしれませんし、型エラーに嵌ま
> ってしまうだけなのかもしれません。
>
> このあたりは MLer に聞くしかなさそうな雰囲気です。


別の例では、strict な部分が問題になると言っていますが。

Note do not try to run the SML program because it will never terminate.

Monads for the Dazed and Confused (SML)
http://www.cs.fit.edu/~satkin/monads.html


It won't work the same as the one in Haskell, because Ocaml
evaluates the right operand before it's needed, and you don't buy
anything by fixing it so that it takes a Lazy.t value instead.

Ocaml monad
http://pauillac.inria.fr/~aschmitt/cwn/2003.03.18.html#2



>>   val fix    : ('a io -> 'a io) -> 'a io

一年ぐらい前に2週間ほどやっただけのですっかり忘れていましたが、
そういえば ML ではキャストを使うだけであって、型クラスや型シノニム
は存在しないんでしたね。
(module の signature としては使うようですが。)


そういうことを思い出して、Ocaml に聞いて見たところ、再帰定義そのものが
問題になるケースもあるようです。

let y f = f (y f);;
              ^
Unbound value y


案の定、"How to Declare an Imperative" の fix の定義もこれに引っ
かかってしまいます。

>> fun fix h  = let fun f () = h f () in f end

let fix h  = let fun f () = h f () in f ;;
                               ^
Unbound value f



注: SML と Ocaml では以下のような文法上の違いがあります。

SML vs. OCaml
http://www.ps.uni-sb.de/~rossberg/SMLvsOcaml.html


-- 
shelarcy <shelarcy / capella.freemail.ne.jp>
http://page.freett.com/shelarcy/ 

--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/