空列表问题的头函数
我想在地图内使用'head'函数。 问题是'head'函数只接受非空列表。 我有名单列表:空列表问题的头函数
let ll =[["dog", "cat"], ["pig", "cow"], []]
我需要遍历目录列表中两次
let listOne = filter(\x -> if length x > 0) ll map(\x -> head x) listOne
我不知道我是否能一次迭代列表的列表或把一个“如果条件”没有“过滤器”的地图里面
任何建议,将不胜感激。
回答:
是的,其实你可以把它写成一个列表理解声明,并使用模式,而不是匹配:
result = [ h | (h:_) <- ll ]
或作为一个函数:
heads :: [[a]] -> [a] heads ll = [ h | (h:_) <- ll ]
所以在这里,我们使用匹配所有非空列表的模式(h:_)
,我们直接获得此列表的头部h
并将其添加到列表中。如果您在列表理解中使用模式(在左侧的箭头<-
的左侧,它将跳过与模式不匹配的元素)。
这也比使用length
更安全的,因为length
会卡住进入无限循环,如果你是无限名单的工作。此外,通过在非全部函数上使用模式,我们有更多的句法保证这个函数将起作用(是的,一旦非空元素被过滤,我们当然确定head
不会导致错误,但是我们只知道这是因为我们有关于head
函数的信息)。
请注意,由于您使用if
而没有then
和else
部分,因此您的尝试将导致语法错误。
或者,我们可以像@DanielWagner说,不同的使用写heads
功能,比如:
heads :: [[a]] -> [a] heads ll = concatMap (take 1) ll
,或者使用列表单子的绑定:
heads :: [[a]] -> [a] heads = (take 1 =<<)
或我们可以调换2d列表。在这种情况下,第一行包含列表的所有头部。由于不能保证有这样的行,所以我们可以在末尾附加一个空列表,如:
heads :: [[a]] -> [a] heads = head . (++ [[]]) . transpose
以上是 空列表问题的头函数 的全部内容, 来源链接: utcz.com/qa/264322.html