在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。
答案 0 :(得分:24)
monad是IO
。这是GHCi行为的一个小怪癖。它会尝试使用IO a
统一输入的类型;如果成功,则运行IO
操作并尝试show
结果。如果您为其提供IO
操作以外的其他操作,则只会尝试show
该值。
出于同样的原因,这些产生相同的输出:
Prelude> "hello"
"hello"
Prelude> print "hello"
"hello"