fmap打印值不打印任何内容

Sib*_*ibi 1 haskell functor

为什么以下内容不能打印任何内容:

?> fmap print (pure 2)
Run Code Online (Sandbox Code Playgroud)

虽然这样的工作:

?> fmap id (pure 2)
2
Run Code Online (Sandbox Code Playgroud)

Zet*_*eta 6

遵循以下类型:

fmap print (pure 2) :: Applicative f => f (IO ())
fmap id (pure 2)    :: (Num b, Applicative f) => f b
Run Code Online (Sandbox Code Playgroud)

让我们替换fIO:

fmap print (pure 2) :: IO (IO ())      -- #1
fmap id (pure 2)    :: (Num b) => IO b -- #2
Run Code Online (Sandbox Code Playgroud)

现在你可以清楚地看到#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操作的结果.

  • 为了使这个答案完整,最好简单讨论ghci如何选择如何处理表达式.具体来说:`IO`动作被执行,并且它们的结果被打印(如果它是`Show`的实例而不是`()`)或者否则被丢弃; 总是打印非``IM`值(可能导致"没有'显示'的实例"错误).这就解释了为什么类型为"IO(IO a)"的东西不被打印:外部的"IO"动作被执行,但内部的"IO"动作被丢弃,因为"IO"没有"Show"实例. (6认同)