なぜ私はこれを行うことができません:
import Data.Char
getBool = do
c <- getChar
if c == 't'
then IO True
else IO False
を使用する代わりにreturn
?
なぜ私はこれを行うことができません:
import Data.Char
getBool = do
c <- getChar
if c == 't'
then IO True
else IO False
を使用する代わりにreturn
?
ほとんどの人が信じているよりもはるかに少なく、モナドのIO
周りには魔法がほとんどありません。ST
恐ろしい IO 型はGHC.Primnewtype
で定義されているだけです:
newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
まず第一に、上記でわかるように、IO
コンストラクターの引数は の引数と同じではありませんreturn
。State
モナドの単純な実装を見ると、より良いアイデアを得ることができます:
newtype State s a = State (s -> (s, a))
次に、IO は抽象型です。コンストラクターをエクスポートしないのは意図的な決定であるため、コンストラクターを構築しIO
たりパターン マッチしたりすることはできません。これにより、入出力が存在する場合でも、Haskell は参照透過性やその他の有用なプロパティを適用できます。