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

> > foo :: Double -> Double
> > 
> > foo x | x > 0  = log x   -- 正常な入力値
> >       | x <= 0 = let userInput = *****  -- 不正な入力値なのでユーザから入力させる
> >                  in log userInput
> 
> Double は Prelude で Read クラスのインスタンスであること
> が宣言されていますので、以下のようになります。
> (ユーザからの入力が数字じゃなかったときの例外処理は省略しますが、)
> 
> foo :: Double -> IO Double
> foo x | x > 0     = return (log x)
>       | otherwise = do userInput <- hGetLine stdin 
>                        foo (read userInput)

  foo (eval (read userInput))

ができるかどうか、というのが焦点です。readの返す型はReadに限定できますが、
一般にevalの返す型は限定できませんね。
EvalResultみたいなクラスを定義して、「あらゆる可能な型はEvalResultの
インスタンスである」とするなら動くのでしょうか。

もひとつ、現実的なシナリオとして、
 foo :: Doulbe -> Double
が既に存在していて、あちこちで使われているのでシグネチャは
変更できない、そこに userInput の処理を組み込みたい、
というケースが考えられますが…

--shiro

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