2016-03-05 131 views
2

我已经看到pure 1的类型是(Num a, Applicative f) => f a,这很明显。 所以,如果我想使它成为一个Maybe IntHaskell - Applicative/Monad实例

Prelude> pure 1 :: Maybe Int 
Just 1 

这个怎么样?

Prelude> pure 1 
1 
Prelude> return 1 
1 

这是怎么回事?为什么不抱怨不知道选择哪个实例?

编辑

我认为这个行为实际上已经无关单子或applicatives,但是这是我来到它的背景下...

+1

请参阅[提示时的I/O操作]中的'返回True'(https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/interactive-evaluation.html) –

回答

3

这是ghci中的特殊性。它有特殊的处理动作IO,这些动作不只是“计算”并打印出来(你无法打印IO动作),而是执行结果†打印了。所以,

Prelude> pure 1 :: IO Integer 
1 

按照behzad.nouri的评论,here's the relevant manual section


†只要它是IO aShow a而不是a~(),否则只有该行为被执行。

+0

所以,实际上它与Monad/Applicative实例有关,因为IO是Monad/Applicative/Functor ...我是对吗? – FtheBuilder

+1

那么,如果IO不适用,那么这显然不起作用。我不确定GHCi如何决定将表达式解释为'IO';显然它首先尝试将任何类型与“IO a”统一起来,并且只有在失败时才进入打印专用路由。这与monads没有任何关系。 – leftaroundabout