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

Haskell:链接getPermissions和searchable时类型不匹配?,haskell,Haskell,我是haskell的一个新手,我试图理解为什么下面的代码似乎失败了 为什么我不能写: getPermissions "." >>= searchable 但我可以写: do { p <- getPermissions "."; return $ searchable p } do{p>=可搜索 我的理解是,(>>=)的操作类似于(@Arjan上面的评论帮助我更好地了解了正在发生的事情。我的一些额外探索似乎巩固了解决方案 正如我在上面的第二条评论中提到的,我似乎忽略了绑定的

我是haskell的一个新手,我试图理解为什么下面的代码似乎失败了

为什么我不能写:

getPermissions "." >>= searchable
但我可以写:

do { p <- getPermissions "."; return $ searchable p }
do{p>=可搜索

我的理解是,
(>>=)
的操作类似于
(@Arjan上面的评论帮助我更好地了解了正在发生的事情。我的一些额外探索似乎巩固了解决方案

正如我在上面的第二条评论中提到的,我似乎忽略了绑定的rhs中使用的函数的返回类型(
>=
)。由于
searchable
返回一个
Bool
,根据我在上面看到的错误消息,它不完全符合rhs的类型,需要是某种类型包装在
IO
中(
IO b0
)。通过使用
return
提升
searchable
Bool
返回类型,我满足
=
的rhs类型

@Arjan在评论中的代码也给出了我想要的简明形式:

getPermissions "." >>= (return . searchable)

非常感谢!

您的第二个示例相当于:getPermissions”“>>=(return.searchable)谢谢,@Arjan.我刚刚注意到我可以使用
getPermissions”“>=(\p->return$searchable p)
这似乎与您的评论相同。但我仍然不清楚为什么此示例与我以前看到和尝试过的其他IO示例不同。一些非单体函数返回类型是否比其他类型更容易升级为单体函数返回类型?请回答我关于类型升级的最后一个问题……我想我只是忽略了或忽略了返回绑定rhs上的函数类型。需要记住的类型信息太多了……我只想补充一点,Arjan注释中的括号是不必要的,您还可以编写
searchable getPermissions“
其中
fmap
的中缀同义词,在
Control.Applicative
中定义。谢谢,@raymonad!这是在实践中使用
的一个很好的例子。我将为将来记下它。
Control.Monad.liftM
是执行此操作的库函数。另一个答案中的应用函数是不过,我觉得更好。
getPermissions "." >>= (return . searchable)