为什么以下内容不能打印任何内容:
?> fmap print (pure 2)
Run Code Online (Sandbox Code Playgroud)
虽然这样的工作:
?> fmap id (pure 2)
2
Run Code Online (Sandbox Code Playgroud)
遵循以下类型:
fmap print (pure 2) :: Applicative f => f (IO ())
fmap id (pure 2) :: (Num b, Applicative f) => f b
Run Code Online (Sandbox Code Playgroud)
让我们替换f为IO:
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操作的结果.