在ghci中获得IO Monad的结果

时间:2015-08-10 16:35:11

标签: haskell io

假设:

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时会发生什么?

2 个答案:

答案 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中,应该是这样。

相关问题