我是haskell的新手,我试图理解为什么下面的代码似乎失败了。
为什么我不能写:
getPermissions "." >>= searchable
但我可以写:
do { p <- getPermissions "."; return $ searchable p }
前者因以下错误而失败:
<interactive>:65:24:
Couldn't match type `Bool' with `IO b0'
Expected type: Permissions -> IO b0
Actual type: Permissions -> Bool
In the second argument of `(>>=)', namely `searchable'
In the expression: getPermissions "." >>= searchable
In an equation for `it': it = getPermissions "." >>= searchable
我的理解是(>>=)
与(<-)
的操作方式类似,有效地将monad中的未包装值传递给非monad函数。
我不理解的是什么?怎么能简单地将getPermissions
和searchable
链接起来/组成?
非常感谢您的协助!
答案 0 :(得分:2)
正如我在上面的第二条评论中所提到的,我似乎忽略了绑定的rhs中使用的函数的返回类型(>>=
)。由于searchable
返回Bool
,因此根据我在上面看到的错误消息({{1},它并不完全符合rhs'类型,它需要包含在IO
中的某种类型。 }})。通过使用IO b0
宣传searchable
的{{1}}返回类型,我满足Bool
的rhs类型。
@ Arjan在他的评论中的代码也提供了我正在寻找的简洁形式:
return
非常感谢!