List Haskell中的列表-如何在没有映射的情况下分离每个列表的第一个元素
例如: 我在Haskell的列表是: [1,2,3],[7,6,8],[0,3,4]] 我需要列表中服务器列表的所有第一个元素 没有“map”我如何获得输出[1,7,4]? 我需要一个模式匹配的解决方案,而不是这个: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作为单独的函数实现。在完成所有这些工作之后,您可能可以重
列表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[]=[]