Haskell:链接getPermissions和搜索时类型不匹配?

时间:2014-01-02 20:57:32

标签: haskell

我是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函数。

我不理解的是什么?怎么能简单地将getPermissionssearchable链接起来/组成?

非常感谢您的协助!

1 个答案:

答案 0 :(得分:2)

上面@ Arjan的评论帮助我更好地了解了发生了什么。我的一些额外探索似乎巩固了解决方案。

正如我在上面的第二条评论中所提到的,我似乎忽略了绑定的rhs中使用的函数的返回类型(>>=)。由于searchable返回Bool,因此根据我在上面看到的错误消息({{1},它并不完全符合rhs'类型,它需要包含在IO中的某种类型。 }})。通过使用IO b0宣传searchable的{​​{1}}返回类型,我满足Bool的rhs类型。

@ Arjan在他的评论中的代码也提供了我正在寻找的简洁形式:

return

非常感谢!