假设:
Prelude> let x = return 100 :: IO Int
尝试评估x
会返回其包装值。
Prelude> x
100
但是,我无法通过show
获得价值。
Prelude> show x
<interactive>:4:1:
No instance for (Show (IO Int)) arising from a use of ‘show’
In the expression: show x
In an equation for ‘it’: it = show x
当我在ghci中输入x
时会发生什么?
答案 0 :(得分:8)
如果在GHCi中输入类型为IO t
的表达式,它会将其解包并打印结果值。也就是说,如果输入ioExp
,GHCi将执行val <- ioExp; print val
(如果输入非IO表达式exp
,GHCi将执行print exp
)。
答案 1 :(得分:4)
您无法show
IO Int
行动。该动作可能需要执行副作用以产生Int
,例如询问用户这样的号码。相反,show
的类型承诺返回String
,即一个简单的纯字符串,没有任何副作用。
如果您愿意,可以定义自己有效的show
变体:
showIO :: Show a => IO a -> IO String
showIO = fmap show
请注意上面的结果不是普通字符串,而是包含在IO
monad中,应该是这样。