使用 Haskell 遍历元组列表



我有一个元组列表

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 遍历元组列表?

您的问题不是特定于元组列表,您需要知道如何遍历任何内容的列表。

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

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 的"monadic"版本,而 _ 我们在执行后抛出结果(。

mapM_ f xs = sequence_ (map f xs)

TL:DR 所以要显示你的每个元组,你只需要写mapM_ print yourList.

最新更新