当没有给出上下文时,Haskell中返回5的类型是什么?

时间:2015-01-13 22:38:56

标签: haskell monads

this question中OP询问表达式return 5的类型是什么,并且在该问题中已经给出了答案:它是泛型类型,可以通过键入

:t return 5

在Haskell解释器中:

return 5 :: (Num a, Monad m) => m a

return的具体实施取决于其显示的上下文:类型推断会将m限制为特定的monad,例如Maybe[],{ {1}},等等。

我还可以强制解释器通过指定类型来选择特定的monad,例如

IO

等等。

现在,如果我在没有指定类型的情况下键入表达式Prelude> return 5 :: Maybe Int Just 5 Prelude> return 5 :: [Int] [5] ,我会得到:

return 5

这对我来说非常令人惊讶:我宁愿期望解释器告诉我它无法选择Prelude> return 5 5 的适当实现,因为它无法推断出要使用的monadic类型。

所以我的问题是:Haskell在这里使用了哪些具体的monad?根据这个monad选择的标准?

修改

谢谢你的回答!事实上,如果我尝试编译这个程序:

return

我收到错误:

module Main
where

a = return 5

main :: IO ()
main = putStrLn "This program should not compile"

所以它只适用于GHCi,原因是Jon。

1 个答案:

答案 0 :(得分:24)

monad是IO。这是GHCi行为的一个小怪癖。它会尝试使用IO a统一输入的类型;如果成功,则运行IO操作并尝试show结果。如果您为其提供IO操作以外的其他操作,则只会尝试show该值。

出于同样的原因,这些产生相同的输出:

Prelude> "hello"
"hello"
Prelude> print "hello"
"hello"