list - 空列表问题的头函数

标签 list haskell filter

我想在 map 中使用“head”功能。 问题是“head”函数只接受非空列表。 我有列表列表:

let ll =[["dog", "cat"], ["pig", "cow"], []]

我需要遍历列表列表两次

let listOne = filter(\x -> if length x > 0) ll
map(\x -> head x) listOne

我想知道我是否可以迭代列表的列表一次或在没有“过滤器”的情况下在 map 中放置一个“if 条件”

如有任何建议,我们将不胜感激。

最佳答案

是的,事实上你可以把它写成一个列表理解语句,然后使用模式匹配:

result = [ h | (h:_) <- ll ]

或作为函数:

heads :: [[a]] -> [a]
heads ll = [ h | (h:_) <- ll ]

所以这里我们使用模式 (h:_)匹配所有非空列表,我们直接得到头部 h这样的列表并将其添加到列表中。如果您在列表理解中使用模式(在左箭头 <- 的左侧,它将跳过与模式不匹配的元素)。

这也比使用 length 更安全 , 自 length如果您使用无限 列表,将会陷入无限循环。此外,通过在非总 head 上使用模式函数,我们有更多的句法保证这个函数会起作用(是的,一旦过滤了非空元素,我们当然可以肯定 head 不会导致错误,但我们只知道这是因为我们有关于 head 函数的信息)。

请注意,您的尝试将导致语法错误,因为您使用了 if , 没有 thenelse部分。

或者,我们可以像@DanielWagner说,写heads功能不同,例如使用:

heads :: [[a]] -> [a]
heads ll = concatMap (take 1) ll

或者使用列表 monad 的绑定(bind):

heads :: [[a]] -> [a]
heads = (take 1 =<<)

或者我们可以转置二维列表。在这种情况下,第一行包含列表的所有标题。然而,由于不能保证有这样一行,我们可以在末尾附加一个空列表,例如:

heads :: [[a]] -> [a]
heads = head . (++ [[]]) . transpose

关于list - 空列表问题的头函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47870762/

相关文章:

如果缺少,Python 将元素添加到列表中的列表

python - 对于列表的每个成员,将其写入单独的文件 python

Python:附加到存储在搁置字典中的实例所拥有的列表

haskell - Show Haskell 的实例

haskell - 错误 : "Failed to load interface for ' Data. Either.Utils'"

javascript - 通过管道同时允许多个过滤器值 - Angular

swift 3 : Filter a range

java - 不使用迭代循环分配 Java 列表的子集

haskell - 异构列表中的单例

arrays - Swift 字符串数组