fmap打印值不打印任何内容

时间:2014-07-03 09:13:56

标签: haskell functor

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

λ> fmap print (pure 2)

这样的事情有效:

λ> fmap id (pure 2)
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