我正在尝试从使用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返回一个数组。我怎么能返回一个可能值?
答案 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)类型的值。