首页 > 解决方案 > 遍历 Haskell 中的 3 元组列表

问题描述

plusOne :: [[(Int, Int, Int)]] -> [[(Int, Int, Int)]]

给定一个三元组列表。如果我想遍历列表并对 Int 值 +1,我应该如何处理?我不确定这是否是应该使用地图的场景。

有人可以指出我正确的方向吗?

标签: haskellrecursionfunctional-programming

解决方案


拆分功能。清单很简单;每人一个map。但是元组不会像在 Python 中那样遍历,所以它们需要解包才能访问元素。这可以通过泛型编程实现,但通过模式匹配更容易。元组可以包含不同类型的字段,因此map无法访问所有字段。我们可以专门为三元组制作自己的地图模拟:

map3t :: (x -> y) -> (x, x, x) -> (y, y, y)
map3t f (a, b, c) = (f a, f b, f c)

现在我们可以检查我们类型的每个级别并分别处理它:

op :: Int -> Int
op = (+1)
t3 :: (Int, Int, Int) -> (Int, Int, Int)
t3 = map3t op
lt3 :: [(Int, Int, Int)] -> [(Int, Int, Int)]
lt3 = map t3
llt3 :: [[(Int, Int, Int)]] -> [[(Int, Int, Int)]]
llt3 = map lt3

这不是递归,尽管map可以使用递归 ( Data.List.mapis) 来实现。每个函数为内部级别调用不同的函数。


推荐阅读