我正在尝试创建一个函数 justifyList
这需要 Maybe
的列表对象 ( [Maybe a]
) 并返回 Just
的所有对象的列表类型,丢弃任何 Nothing
的元素在参数列表中。
我现在的解决方案是
justifyList :: [Maybe a] -> [a]
justifyList [] = []
justifyList (x:xs)
| (isNothing x) = justifyList xs
| otherwise = x : justifyList xs
我尝试递归地遍历参数列表并递归地放置当前元素 x
返回列表 [a]
, 如果是 Just
类型。但是,在解释类型不匹配时会产生错误
Couldn't match type a with Maybe a
因此我的问题是;如何递归遍历
Maybe
的列表对象?如果这个解决方案足够了,我该如何转换xs
属于Maybe
类型?
最佳答案
这样的功能已经存在于 Data.Maybe
module并被命名为 catMaybes :: [Maybe a] -> [a]
.
您可以使用递归来实现这一点,但使用列表理解来实现这一点可能更优雅,因为这允许我们同时有效地进行模式匹配和展开,所以:
justifyList :: [Maybe a] -> [a]
justifyList xs = [ x | Just x <- xs ]
仅适用于满足 Just x
的项目模式,它将产生一个项目,所以 Just x <- xs
也执行过滤。
关于list - 如何在 Haskell 中使用 Maybe 对象递归迭代列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71655523/