为什么以下内容不会打印任何内容:
λ> fmap print (pure 2)
这样的事情有效:
λ> fmap id (pure 2)
2
答案 0 :(得分:6)
按照以下类型:
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还有以下rules about interactive evaluation:
2.4。提示时的互动评估
在提示符下键入表达式时,GHCi会立即计算并打印结果:
2.4.1。提示时的I / O操作
GHCi不仅仅是在提示时进行简单的表达式评估。如果为某些
IO a
键入a
类型的内容,则GHCi将其作为IO计算执行。此外,如果(且仅当):
,GHCi将打印I / O操作的结果
结果类型是
Show
的实例。结果类型不是()。
由于IO a
不是Show
的实例,因此不会打印IO操作的结果。
答案 1 :(得分:2)
你的表达式返回一个计算(不执行它)。
你想要
fmap print (pure 2) >>= id
,我们得到你的计算并在monad中运行。
查看您的类型
fmap print (pure 2) :: Applicative f => f (IO ())
请注意
fmap print (pure 2) >>= id -- #1
与
非常不同(但相同"视觉和#34;结果)fmap id (pure 2) -- #2
#1我们进行计算并在monad中运行打印一个数字
#2我们接受一个数字并通过fmap
返回一个数字获得价值
(再看一下类型
fmap id (pure 2) :: (Num b, Applicative f) => f b