如何从PureScript中的do notation返回Maybe值?

时间:2016-04-03 01:11:09

标签: maybe purescript do-notation

我正在尝试从使用do notation的函数返回Maybe值,但我似乎无法让它工作。此函数采用字符串(“文件名”)和要搜索的路径...

findIn :: String -> Path -> Maybe Path
findIn search start = do
    file <- ls start
    if ((filename file) == search)
      then Just file
      else Nothing

WHERE ...

ls :: Path -> Array Path
filename :: Path -> String

但是我不断收到错误“Count not match Type Array with Maybe Maybe”,所以看起来编译器期望do notation返回一个数组。我怎么能返回一个可能值?

2 个答案:

答案 0 :(得分:2)

你不能混合这样的单子。

当你写:

file <- ls start
对于数组中的每个值file,它有点像说&#34;&#34;所以你处于多个可能值的背景下。

但是其余的代码都在Maybe的上下文中,它只能处理一个(或零)值。

在模块Data.Foldable中有一个find函数,它通过搜索符合某些条件的单个项来完成主函数的大部分工作。它的实际类型更为通用,但当受限于Arrays时,它是这样的:

find :: forall a. (a -> Boolean) -> Array a -> Maybe a

然后你可以写:

findIn search start = find (\x => x == search) $ ls start

答案 1 :(得分:1)

好的,我找到了可行的方法,但我不确定它是否理想。

InvokableUser<Foo>

所以看起来do-notation会返回Array(Maybe Path)类型的值。