如何在Haskell中将列表的列表转换为元组,添加一些规范

yk9xbfzb  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(154)

我有一个清单清单:[[43525,3,2],[43615,2,2],[41111,1,2],[74855,5,3]]
我想把这个列表转换成一个元组列表,只取每个列表的第二个和最后一个元素,每次Map到列表上时都加上15*ii是索引)。
以第一个例子为例:[[43525,3,2],[43615,2,2],[41111,1,2],[74855,5,3]]
我想要这样的东西:[(3,2) , (17, 2), (31, 2), (50, 3)]
17 = 3+(15*1)
31 = 1+(15*2)
50 = 5+(15*3)
我已经创建了一个函数,该函数接受列表列表并将其转换为元组列表:
从此[[43525,3,2],[43615,2,2],[41111,1,2],[74855,5,3]]
到这个[(3,2),(2,2),(1,2),(5,3)]

tupleInfo [[]] = []
    tupleInfo [[_,x,y]] = [(x,y)]
    tupleInfo list = map (\[_,x,y] -> (x,y)) list
ryevplcw

ryevplcw1#

您尝试执行两个不同的操作:首先你要把列表列表转换成元组列表,其次你要把15*i添加到每个元组的第二个元素中,让我们试着写两个不同的函数,然后把它们组合在一起:

convertToTuples :: [[Int]] -> [(Int, Int)]
convertToTuples [[]] = []
convertToTuples xs = map (\[_, x, y] -> (x, y)) xs

如果你仔细看一下,它和你写的tupleInfo的第一个版本完全一样,只是它去掉了第二个多余的case:map已经正确地处理了它。

add15 :: [(Int, Int)] -> [(Int, Int)]
add15 xs = zipWith (\idx (x, y) -> (x+15*idx, y)) [0..] xs

正如您所建议的,使用zipWith函数非常简单。现在您可以通过将两个函数组合在一起来获得解决方案:

solution :: [[Int]] -> [(Int, Int)]
solution xs = add15 (convertToTuples xs)
-- in a more Haskell-y way you could write:
-- solution = add15 . convertToTuples

我总是喜欢将域逻辑分解为小的自包含函数,然后可以组合这些函数,这样更容易对每个步骤进行推理。

fxnxkyjh

fxnxkyjh2#

答案很简单,我使用了Zipwith函数。

tupleInfo [[]] = []
    tupleInfo [[_,x,y]] = [(x,y)]
    tupleInfo list =  zipWith (\[_,x,y] i -> (x+15*i,y)) list [0..]

相关问题