我如何 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
我正在尝试 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