Haskell中的列表列表 - 如何在没有地图的情况下分隔每个列表的第一个元素

时间:2017-05-09 12:31:45

标签: list haskell design-patterns pattern-matching matching

例如: 我在Haskell中的列表列表是:

[[1,2,3],[7,6,8],[0,3,4]]

我需要列表中所有第一个错误列表元素。

如何在没有" map"的情况下获得输出[1,7,4]? 我需要一个模式匹配的解决方案,而不是这个: list x = map head x

4 个答案:

答案 0 :(得分:2)

查看maphead函数的定义。然后只需复制实现,将两个功能合二为一。为方便起见,您只需复制map,替换函数,使用map传递给head,然后使用您自己的head。您可以使用case <expr> of ...表达式不将您自己的头部作为单独的函数实现。完成所有这些工作后,您可以重构您的功能,使其更加优雅。

答案 1 :(得分:1)

我是Haskell的新手,但这是我在这里创建的。

我使用了列表理解和模式匹配。

--Type definition. Not mandatory but recommended.
firstItemOfEveryList :: [[a]] -> [a]
--First pattern. If the list is empty return a empty list.
firstItemOfEveryList [] = [] 
--Catch all pattern. Receive a list of lists (xxs). For every inner list (xs <- xxs) call the head method (head xs), but only when the inner list is not null or empty (not(null xs).
firstItemOfEveryList xxs = [head xs | xs <- xxs, not(null xs)]

空列表模式有点不必要,因为它只给出了与最后一次捕获相同的结果。希望它有所帮助。

答案 2 :(得分:1)

.map

答案 3 :(得分:1)

使用嵌套模式匹配的另一个答案:

firsts :: [[a]] -> [a]
firsts      []      = []
firsts   ([]:xss)   = error "sublist is empty"
firsts ((x:xs):xss) = x:firsts xss