我如何 return 来自 PureScript 中 do 符号的 Maybe 值?

How can I return a Maybe value from do notation in PureScript?

我正在尝试 return 来自使用 do 表示法的函数的 Maybe 值,但我似乎无法让它工作。此函数接受一个字符串 (The "filename") 和一个搜索路径...

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

在哪里...

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

但我不断收到错误 "Count not match Type Array with type Maybe",因此编译器似乎希望对 return 数组使用 do 表示法。我如何 return 一个可能的值?

好的,我找到了一些有用的东西,但我不确定它是否理想。

findIn :: String -> Path -> Maybe Path
findIn search start = if (length r == 1)
                      then head r
                      else Nothing
  where
    r = do
      file <- ls start
      guard $ (filename file) == search
      [file]

所以它看起来像 do-notation returns 类型 Array(Maybe Path) 的值。

你不能那样混合 monad。

当你写:

file <- ls start

这有点像说 "for each value file in the array..." 所以你处于多个可能值的上下文中。

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

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

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

那么你可以这样写:

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