【发布时间】:2018-08-13 16:17:37
【问题描述】:
有人可以向我解释为什么在使用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]不一样吗?
为什么我必须再次装箱?类型的单子的结果不是:[FilePath] 如果是这样,为什么它不能打印结果?
lenAction=list>>=return . length
【问题讨论】:
-
Re: (3): 不,
length不会隐式打印其结果。如果这就是你想要的,你必须要求它:例如listAction >>= print . length。可能会出现这种混淆,因为为了用户友好,ghci 通常会在您不注意的情况下为您隐式调用print包装纯事物。它会在您输入的整个表达式周围包裹一个print(例如,如果该类型已检查,则可以插入print (listAction >>= length)),但不会深入到您的表达式内部以尝试猜测print应该去哪里。