用Haskell遍历元组列表

时间:2018-10-02 21:11:48

标签: haskell functional-programming

我有一个元组列表

   list =  [(1,2,4),(4,1,4),(3,7,2),(4,2,5),(1,5,9)]

我想遍历列表并单独获取每个元组。 例如,也许打印

(1,2,3)

(4,1,4)

(3,7,2)

以此类推。

我在访问列表中的项目时遇到了麻烦,因为如果我要进行list!!1,则尝试访问list!!3之后将无法访问所有其他元素。

如何用haskell遍历元组列表?

1 个答案:

答案 0 :(得分:3)

您的问题不是特定于 tuples 列表的,您需要的是知道如何遍历所有列表。

传统上,由于没有循环,因此功能语言中的“迭代”是通过递归完成的,因此合理的第一个解决方案如下所示:

printAList [] = return ()
printAList (x:xs) = do
  print x
  printAList xs

但是,当然,每次要遍历列表时都要编写递归是很愚蠢的,因此所有功能语言都包含高阶函数,该函数采用参数中的函数来指示对每个元素的处理方式列表以及如何合并结果。常见的函数是map,它会在每个元素上创建带有传递函数结果的新列表:

map f [] = []
map f (x:xs) = f x : map f xs

因此,在这里您可能会考虑做map print yourList。不幸的是,print并未真正显示其自变量,而是一个创建IO操作的函数,该函数在执行时将显示自变量。因此,您将获得地图上的动作列表并执行,您必须使用执行动作列表的函数:sequence_(_表示我们不在乎每个动作)

sequence_ [] = return ()
sequence_ (act : acts) = do
  act
  sequence_ acts

因此,您的最终代码为sequence_ (map print yourList)。当然,将动作创建函数应用于列表的元素并执行它们非常常见,因此您需要具有专用功能:mapM_(M表示这是map的“单子”版本以及我们在执行后将结果丢弃的_。

mapM_ f xs = sequence_ (map f xs)

TL:DR因此,要显示每个元组,您只需要编写mapM_ print yourList