16

なぜ私はこれを行うことができません:

import Data.Char

getBool = do
  c <- getChar
  if c == 't' 
    then IO True 
    else IO False

を使用する代わりにreturn

4

3 に答える 3

4

ほとんどの人が信じているよりもはるかに少なく、モナドのIO周りには魔法がほとんどありません。ST

恐ろしい IO 型はGHC.Primnewtypeで定義されているだけです:

newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))

まず第一に、上記でわかるように、IOコンストラクターの引数は の引数と同じではありませんreturnStateモナドの単純な実装を見ると、より良いアイデアを得ることができます:

newtype State s a = State (s -> (s, a))

次に、IO は抽象型です。コンストラクターをエクスポートしないのは意図的な決定であるため、コンストラクターを構築しIOたりパターン マッチしたりすることはできません。これにより、入出力が存在する場合でも、Haskell は参照透過性やその他の有用なプロパティを適用できます。

于 2013-09-30T12:10:24.773 に答える