list - 如何在 Haskell 中使用 Maybe 对象递归迭代列表

标签 list haskell recursion maybe

我正在尝试创建一个函数 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/

相关文章:

java - 如何从文本文件中用逗号分割返回的 List<String> ?

html - 使用空格 CSS 制作列表元素 block

haskell - 在 Mac OS 上的 Haskell 中使用 text-icu 库

Haskell:如何从 IO (a) 转换为 a?

haskell - Control.Exception.evaluate 对等效函数生成的 thunk 的处理方式不同

c - 调用另一个递归函数的递归函数的运行时分析

c++ - map 实现中的列表迭代器实现 - 麻烦

c# - List.OrderBy 定义变量中的顺序

.net - 如何将用英语单词编写的数字解析为 F# 中的等效数字?

java - 查找一个字符串在另一个字符串中的字母