繁体   English   中英

重新装箱GHCI纯价值的目的

[英]Purpose of re-boxing pure value for GHCI

有人可以向我解释为什么使用ghci我必须“重新装箱”单子返回的值吗?

 listAction=listDirectory "D:\\"
 lenAction=listAction>>=length 

错误:

Couldn't match type `Int' with `IO b0'
      Expected type: [FilePath] -> IO b0
        Actual type: [FilePath] -> Int

我不明白我的逻辑有何缺陷:

  1. 使用listAction给我一个IO [FilePath]
  2. 我将listAction的值listAction[FilePath] ,并将其赋予length
  3. 现在不应该length只是打印结果到控制台是一个纯粹的功能? 如果我说length [1,2,3]是不是一样?

为什么我必须再次装箱? 不是monad类型的结果: [FilePath] ,如果是,为什么它不能打印结果?

lenAction=list>>=return . length

这只是一个类型错误。

>>=的类型(与IO使用时)为

(>>=) :: IO a -> (a -> IO b) -> IO b

也就是说,第二个参数必须是一个返回IO something类型的值的函数。 length没有这种类型,因此类型检查器会抱怨。

如您所示,可以使用return :: a -> IO a将值提升到IO 那是解决问题的一种方法。

另一种方法是使用fmap

fmap length listAction

这是fmap因为fmap (与IO使用时)是

fmap :: (a -> b) -> IO a -> IO b

(做同一件事的其他方法包括liftM length listActionlength <$> listAction 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM