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



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

当我做return 10 >>= return时,GHCi显示10。当我用:t检查return 10的类型时,它只显示return 10 :: (Monad m, Num a) => m a,而我做typeOf return 10时,我得到一个错误。

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

这遵循了GHCi有点像IO的巨大do块的想法。每当您键入表达式时,它首先尝试查看结果的类型是否可以专门化为IO a形式的内容。如果可以,则执行IO操作并打印结果。否则,它才输出表达式本身的结果。

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

ghci> return 10 >>= return :: Maybe Int
Just 10
ghci> return 10 >>= return :: [Int]
[10]
ghci> return 10 >>= return :: IO Int
10

作为题外话,关于选择Num的哪个实例有一个完全不同的问题,这个问题与默认规则和单态限制有关。