FMAP打印值未打印任何东西(fmap print value doesn't print

2019-10-20 09:23发布

为什么下面不显示任何信息:

λ> fmap print (pure 2)

而像这样的工作:

λ> fmap id (pure 2)
2

Answer 1:

按照类型:

fmap print (pure 2) :: Applicative f => f (IO ())
fmap id (pure 2)    :: (Num b, Applicative f) => f b

让我们更换fIO

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操作的结果。



Answer 2:

你表达返回计算(不执行它)。

你要

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


文章来源: fmap print value doesn't print anything