List 空列表问题的head函数

List 空列表问题的head函数,list,haskell,filter,List,Haskell,Filter,我想在地图中使用“head”函数。 问题是“head”函数只接受非空列表。 我有一份清单: let ll =[["dog", "cat"], ["pig", "cow"], []] 我需要迭代列表两次 let listOne = filter(\x -> if length x > 0) ll map(\x -> head x) listOne 我想知道我是否可以迭代列表一次,或者在没有“过滤器”的情况下将if条件放入映射中 如果您有任何建议,我们将不胜感激。是的,事实上您

我想在地图中使用“head”函数。 问题是“head”函数只接受非空列表。 我有一份清单:

let ll =[["dog", "cat"], ["pig", "cow"], []]
我需要迭代列表两次

let listOne = filter(\x -> if length x > 0) ll
map(\x -> head x) listOne
我想知道我是否可以迭代列表一次,或者在没有“过滤器”的情况下将if条件放入映射中


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

是的,事实上您可以将其作为列表理解语句编写,并使用模式匹配:

或者使用列表monad的绑定:

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

是的,事实上,您可以将其作为列表理解语句编写,并使用模式匹配:

或者使用列表monad的绑定:

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

对于空列表,您希望发生什么?只是过滤/忽略它?为什么filter不做你想做的事?filter只删除空列表,但我想使用'head'并对head元素执行一些操作。但是空列表没有head。你需要什么map+过滤器不能做的?如果您只关心重复列表两次,那么它不会。这些操作是惰性评估的。永远不要使用head、tail、!!。假装它们不存在。长度是另一个经常被滥用的功能,因此最好尽可能避免。上面的代码也有布尔盲的问题,你可以用谷歌搜索:它不是检查列表是否为非空,而是在同一步中获取它的第一个元素,它只检查非空性以构建布尔长度x>0,实际上丢弃了第一个元素。稍后,我们需要它,但为时已晚。模式匹配帮助我们避免布尔运算,并保留手头的关键信息。对于空列表,您希望发生什么?只是过滤/忽略它?为什么filter不做你想做的事?filter只删除空列表,但我想使用'head'并对head元素执行一些操作。但是空列表没有head。你需要什么map+过滤器不能做的?如果您只关心重复列表两次,那么它不会。这些操作是惰性评估的。永远不要使用head、tail、!!。假装它们不存在。长度是另一个经常被滥用的功能,因此最好尽可能避免。上面的代码也有布尔盲的问题,你可以用谷歌搜索:它不是检查列表是否为非空,而是在同一步中获取它的第一个元素,它只检查非空性以构建布尔长度x>0,实际上丢弃了第一个元素。稍后,我们需要它,但为时已晚。模式匹配有助于我们避免使用布尔值,并将关键信息保留在手边。一个完全不同的想法:头=头++[[]] . 换位。@DanielWagner:我真的很喜欢这些:,尤其是第一个。同样想法的另一个有趣拼写:heads=concatMap take 1。一个完全不同的想法:头=头++[[]] . 换位。@DanielWagner:我真的很喜欢这些:,尤其是第一个。
heads :: [[a]] -> [a]
heads ll = concatMap (take 1) ll
heads :: [[a]] -> [a]
heads = (take 1 =<<)
heads :: [[a]] -> [a]
heads = head . (++ [[]]) . transpose