List Haskell中的列表-如何在没有映射的情况下分离每个列表的第一个元素

List Haskell中的列表-如何在没有映射的情况下分离每个列表的第一个元素,list,haskell,design-patterns,pattern-matching,matching,List,Haskell,Design Patterns,Pattern Matching,Matching,例如: 我在Haskell的列表是: [1,2,3],[7,6,8],[0,3,4]] 我需要列表中服务器列表的所有第一个元素 没有“map”我如何获得输出[1,7,4]? 我需要一个模式匹配的解决方案,而不是这个: 列表x=映射头x查看map和head函数的定义。然后复制实现,将两个功能组合在一起。为了简化操作,您只需复制map,替换函数,用head传递到map,然后使用自己的head。您可以使用case of…表达式来不将自己的head作为单独的函数实现。在完成所有这些工作之后,您可能可以重

例如: 我在Haskell的列表是:

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

我需要列表中服务器列表的所有第一个元素

没有“map”我如何获得输出[1,7,4]? 我需要一个模式匹配的解决方案,而不是这个:
列表x=映射头x

查看
map
head
函数的定义。然后复制实现,将两个功能组合在一起。为了简化操作,您只需复制
map
,替换函数,用
head
传递到
map
,然后使用自己的
head
。您可以使用
case of…
表达式来不将自己的head作为单独的函数实现。在完成所有这些工作之后,您可能可以重构您的函数,使其更加优雅。

查看
map
head
函数的定义。然后复制实现,将两个功能组合在一起。为了简化操作,您只需复制
map
,替换函数,用
head
传递到
map
,然后使用自己的
head
。您可以使用
case of…
表达式来不将自己的head作为单独的函数实现。在完成所有这些工作之后,您可能可以重构您的函数,使其更加优雅。

我是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)]
——类型定义。不是强制性的,但建议使用。
firstItemOfEveryList::[[a]]->[a]
--第一种模式。如果列表为空,则返回一个空列表。
firstItemOfEveryList[]=[]

--全包模式。接收列表列表(xxs)。对于每个内部列表(xs我对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)]
--类型定义。不是强制性的,但建议使用。
firstItemOfEveryList::[[a]]->[a]
--第一种模式。如果列表为空,则返回一个空列表。
firstItemOfEveryList[]=[]

--捕获所有模式。接收列表列表(xxs)。对于每个内部列表(xs使用嵌套模式匹配的另一个答案:

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

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

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

谢谢!我会试试的!^^^^谢谢!我会试试的!^^^^提示:您可以嵌套模式。如果您有对的列表,您可以使用
f((a,b):xs)=……
。对于列表列表,请使用类似的模式(您可以使用
两次)。记住捕获所有可能的情况。提示:你可以嵌套模式。如果你有一个成对的列表,你可以使用
f((a,b):xs)=…
。对于列表列表,使用类似的模式(你可以使用
两次)。记住捕获所有可能的情况。这很好!!!我是Haskell的noob。你能给我解释一下“/[]”部分吗这是helpfunction吗?我可以在新函数中写入此注释吗?这只是一个验证。我正在检查当前内部列表是否为空,因为如果列表为空,head将抛出一个错误。如果要将此验证放在一个单独的函数中,可以执行以下操作:
firstItemOfEveryList xxs=[head xs | xs您不需要任何这些约束,只需要
Eq a
。如果您将
xs/=[]
替换为
not(null xs)
,你也不需要。谢谢Alexey提供的提示。刚刚解决了问题。在处理Haskell类型类时,我仍然有点迷茫。这很好!!!我是Haskell的noob。你能给我解释一下“/=[]”部分吗这是helpfunction吗?我可以在新函数中写入此注释吗?这只是一个验证。我正在检查当前内部列表是否为空,因为如果列表为空,head将抛出一个错误。如果要将此验证放在一个单独的函数中,可以执行以下操作:
firstItemOfEveryList xxs=[head xs | xs您不需要任何这些约束,只需要
Eq a
。如果您将
xs/=[]
替换为
not(null xs)
,您也不需要。感谢Alexey提供的提示。刚刚修复了答案。在处理Haskell TypeClass时,我仍然有点迷茫。有没有办法使用模式为内部列表添加一些空列表验证?我没有这样做。它应该会失败,因为没有第一个元素。如果要忽略空子列表,请您可以为该
firsts[]]=[]
添加设置有没有办法使用模式为内部列表添加一些空列表验证?我没有这样做。它应该会失败,因为没有第一个元素。如果要忽略空子列表,您可以为该
firsts[]=[]