为什么下面不显示任何信息:
λ> fmap print (pure 2)
而像这样的工作:
λ> fmap id (pure 2)
2
为什么下面不显示任何信息:
λ> fmap print (pure 2)
而像这样的工作:
λ> fmap id (pure 2)
2
按照类型:
fmap print (pure 2) :: Applicative f => f (IO ())
fmap id (pure 2) :: (Num b, Applicative f) => f b
让我们更换f
与IO
:
fmap print (pure 2) :: IO (IO ()) -- #1
fmap id (pure 2) :: (Num b) => IO b -- #2
现在,你可以清楚地看到,#2是一个数字结果的动作,而#1与另一个动作作为结果的动作。
此外,GHCI具有以下约交互式评估规则 :
2.4。 在提示符下互动评价
当你在提示输入一个表达式,GHCI立即评估并打印出结果:
2.4.1。 在提示I / O操作
GHCI确实比在提示简单的表达式求更多。 如果输入型的东西
IO a
对一些a
,然后GHCI执行它作为一个IO-计算。此外,GHCI将打印I / O操作,如果(且仅当)的结果:
结果类型的实例
Show
。结果类型不是()。
由于IO a
不是一个实例Show
,它不会打印的IO操作的结果。
你表达返回计算(不执行它)。
你要
fmap print (pure 2) >>= id
这样,我们得到您的计算和运行它里面单子。
看看你的类型
fmap print (pure 2) :: Applicative f => f (IO ())
注意
fmap print (pure 2) >>= id -- #1
是非常不同的(但相同的“视觉”结果)比
fmap id (pure 2) -- #2
与#1中,我们采取了计算和运行它里面单子打印数
以#2,我们采取了许多,并通过获得价值fmap
返回数
(再次寻找类型
fmap id (pure 2) :: (Num b, Applicative f) => f b