From: Nobuo Yamashita <nobsun / sampou.org>
Subject: [haskell-jp:250] Re: 低レベルプログラミングとstricttypesystem
Date: Sun, 02 Nov 2003 00:56:00 +0900 (JST)

> ユーザ入力は、外界からの入力なので、すべて文字列と看倣せますよね。それを
> 内部の型に変換して使うことになるので、その変換のための汎用 eval を予め用意で
> きるかということになります。
> 
> Haskell ではどうするかというと、ユーザに入力をさせたい値の型を
> あらかじめ、Read クラスのインスタンスとして宣言しておきます。
> 
> read <ユーザの入力文字列> と書いておくだけで、それが使われている文脈からの
> 推論で、型付けされて、その型が、Read クラスのインスタンスであれば、そのときの
> ユーザ入力文字列が、その型の値に変換されます。この多相関数 read が LISP や
> Ruby などの eval だと看倣せます。

read :: String -> Read
eval :: Read -> a

は書けると思うんですが、それを例えば

foo :: Double -> Double

foo x | x > 0  = log x   -- 正常な入力値
      | x <= 0 = let userInput = *****  -- 不正な入力値なのでユーザから入力させる
                 in log userInput

みたいなコードに使えるんでしょうか。
ここで、***** の部分は、evalが正のDouble型の値を返すまで
エラーメッセージを表示してユーザ入力を受け付けるループとします。

getUserInputDoubleみたいなのをインスタンスタイプ毎に
多重定義しておけばいいのかな。

--shiro




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