GHCi如何选择Monad类型的实例来用于多态操作?

时间:2016-08-10 00:03:29

标签: haskell ghci

我是Haskell的新手,所以这可能是一个noob问题。

当我return 10 >>= return GHCi显示10时。当我使用return 10检查:t的类型时,它只是说return 10 :: (Monad m, Num a) => m a,而我typeOf return 10则会收到错误。

但据我所知,Haskell必须使用>>=的特定实例来评估return 10 >>= return,那么它使用哪个实例以及它如何决定使用哪个实例?

1 个答案:

答案 0 :(得分:7)

这是因为GHCi有点像do的{​​{1}}块。每当您输入表达式的内容时,它首先会尝试查看结果的类型是否可以专门用于IO形式的某些内容。如果可以,它会执行IO a操作并打印结果。只有这样才会打印表达式本身的结果。

要强制GHCi转到您想要的任何特定monad,您可以添加类型注释。请注意IO如何得到不同的处理(与表达式在没有任何注释的情况下处理的方式相同)。

IO

顺便说一句,关于选择ghci> return 10 >>= return :: Maybe Int Just 10 ghci> return 10 >>= return :: [Int] [10] ghci> return 10 >>= return :: IO Int 10 的哪个实例存在完全不同的问题,并且该问题与默认规则和单态限制有关。