On Wed, 17 Dec 2003 16:30:48 +0900, TOYOFUKU Chikanobu 
<nobu_toyofuku / nifty.com> wrote:
>> (unit -> unit) => unit になりませんか?
>
>   (unit -> 'a) は 'a と同一視できるからという意味ですか。

それでいいと思います。
>> = の例ですが、type を指定しない状況ではこういう表示されます。
type はラベルで使用するかモジュールの interface として指定するくらいですが
……
(Ocaml の場合と表示が逆になっているのに注意。)

- infix >>=
   fun m >>= k = fn () => let
                            val x = m ()
                            val y = k x ()
                          in
                             y
                          end;

infix >>=
val >>= = fn : (unit -> 'a) * ('a -> unit -> 'b) -> unit -> 'b

- infix >>
   fun m >> n = m >>= (fn () => n);
infix >>
val >> = fn : (unit -> unit) * (unit -> 'a) -> unit -> 'a


>>>   「>>=」の次には ('a -> 'b io) (ここでは 'a が char、'b
>>> が unit なので (char -> (unit -> unit)))がこなくてはいけない
>
>   echo では 'b が unit でしたが 'b が unit ではないときはどう
> なるのでしょう。
>
> 実際のところ ML で
>   fun echo () = getc >>= (fn c =>
>                if (c = #"\n") then
>                  done ()
>                else
>                  putc c >>
>                  echo ()))
> は通るんでしょうか。通るとして実行させたらどうなるんでしょう。
>   自分でも余裕ができたら ML処理系入れて試してみます。

=
=
=
....

処理系がループに陥ってしまうようです。
例え内部で使用されるはずの変数や関数が未定義でも同じようになるみ
たいですから。

> fun echoML () = let val c = getcML () in
>                   if c = #"\n" then
>                     ()
>                   else
>                     (putcML c; echoML ());

でも同様。


ところでさっき試したところ、

- fun putcML c = TextIO.output1(TextIO.stdOut,c);
val putcML = fn : TextIO.elem -> unit
- fun getcML () = valOf(TextIO.input1(TextIO.stdIn));
val gectML = fn : unit -> TextIO.elem
- type 'a io = unit -> 'a;
type 'a io = unit -> 'a
- fun return x = fn () => x;
val return = fn : 'a -> unit -> 'a
- fun putc c = fn () => putcML c;
val putc = fn : TextIO.elem -> unit -> unit
- val getc = fn () => getcML ();
val getc = fn : unit -> TextIO.elem
- val done = return ();
val done = fn : unit -> unit
- fun fix h = let fun f () = h f () in f end;
val fix = fn : ((unit -> 'a) -> unit -> 'a) -> unit -> 'a
- val echo = fix (fn echo =>
                        getc >>= (fn c =>
                          if (c = #"\n") then
                            done ()
                          else
                            putc c >>
                            echo ))

stdIn:41.28-45.34 Error: types of rules don't agree [tycon mismatch]
   earlier rule(s): bool -> unit
   this rule: bool -> unit -> 'Z
   in rule:
     false => (putc c >> echo)
stdIn:40.26-45.36 Error: operator and operand don't agree [tycon mismatch]
   operator domain: (unit -> TextIO.elem) * (TextIO.elem -> unit -> 'Z)
   operand:         (unit -> TextIO.elem) * (char -> unit)
   in expression:
     (getc >>=
       (fn c =>
             (case (<exp> = <exp>)
               of <pat> => <exp>
                | <pat> => <exp>)))


> datatype X = psi_inv of X -> (unit -> unit);
> fun psi (psi_inv (f)) = f;
> fun fixpoint(g) =
>   let fun h(y) = g(fn x => psi(y)(y)(x))
>    in h(psi_inv(h))
>   end;

を使わなくても良いみたい(結果は同様)ですが、きちんと定義できてい
たらいたで if then e1 else e2 の型不一致エラーに陥るようです。
どうやら型の判断が保留になってしまうのが良くないみたいですね。



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

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