gpt4 book ai didi

list - 空列表问题的头函数

转载 作者:行者123 更新时间:2023-12-05 09:17:26 26 4
gpt4 key购买 nike

我想在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com