我是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
,那么它使用哪个实例以及它如何决定使用哪个实例?
答案 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
的哪个实例存在完全不同的问题,并且该问题与默认规则和单态限制有关。