On Mon, 10 Nov 2003 18:04:32 +0900, TOYOFUKU Chikanobu 
<nobu_toyofuku / nifty.com> wrote:
>>> もし型の再帰定義が
>>> できるとしたら具体的にどの型をどう再帰定義で書けるということ
>>> でしょうか。
>>
>> 定義自体は変わりません。
>> bind (>>=)が転がっていく(繋がっていく)ようになるだけです。
>
>   んーー、まだ理解できません。もう少し説明お願いできませんか。

ML では variant 型以外の型の再帰を禁止しています。また、うっかり忘
れてましたけどMLでは型シノニムは定義できません。型定義は関数定義時
に自動的に判別されるだけです。そのため、直接的な型の再帰定義が成立
してしまうような関数定義を拒みます。

このことを指して ML では型の再帰定義ができないと言っているのですが、
どうやら"How to Declare an Imperative"に載っているケースでは無限ルー
プになる問題だけがあるようです。

(* 普通に定義できる……*)
# let return x = fun() -> x;;
val return : 'a -> unit -> 'a = <fun>

# let (>>=) m k = fun() ->
      let x=m () in
      let y=k x () in y;;
val ( >>= ) : (unit -> 'a) -> ('a -> unit -> 'b) -> unit -> 'b = <fun>

これが混乱させている原因なのではないでしょうか?
(知っての通り、Monad の種類に応じて様々な bind を定義する必要があります。)


ML 系の言語は OCaml 少し勉強しただけなので、このことを把握するのにか
なりの時間がかかりました。すみません。
ML と Haskell 双方に強い人がいればいいんですけどね……。


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

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