[英]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
我不明白我的逻辑有何缺陷:
listAction
给我一个IO [FilePath]
listAction
到[FilePath]
,并将其赋予length
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 listAction
和length <$> listAction
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.