如何将2个列表合并在一起

时间:2019-04-25 11:18:06

标签: haskell

我有一个元组[(a1, b1, c1, d1), (a2, b2, c2 d2), (a3, b3, c3, d3), ..., (a50, b50, c50 ,d50)]的列表,还有第二个Int的[2, 1, 4, 3, ..., 50th]的列表。我如何加入这两个列表,使得结果列表类似于[(b1, 2), (b2, 1), (b3, 4), ..., (b50, 50th)]。谢谢

1 个答案:

答案 0 :(得分:0)

所以您有两个列表:

tupleList :: [(a, b, c, d)]
tupleList = [(a1, b1, c1, d1), (a2, b2, c2, d2)]

intList :: [Int]
intList = [1, 2]

您将想要将tupleList映射为仅包含所需值的新形状:

mapTuple :: [(a, b, c, d)] -> [b]

然后,您将想要将这些值与intList结合以创建元组的最终列表:

zip :: [a] -> [b] -> [(a, b])

第二个函数zip已存在于序言中。

第一个功能将由您实现。您可以使用具有签名的高阶函数fmap来做到这一点:

fmap :: Functor f => (a -> b) -> f a -> f b

此签名意味着fmapa -> b中提取一个函数,并使用该函数将某些a中的所有Functor值转换为b值。为了使这个更容易理解,让fmap成为List类型类成员的Functor的具体体现:

fmap :: (a -> b) -> [a] -> [b]

因此,我们所需要做的就是编写一个函数a -> b,将其应用到fmap,然后应用我们的[a],然后我们再返回一个[b]

在这种情况下,我们的a将是(a, b, c, d),我们的b将是b,函数将如下所示:

f :: (a, b, c, d) -> b

将该函数应用于fmap,我们将得到:

fmap f :: [(a, b, c, d)] -> [b]

我们快完成了。现在我们要在主要函数中使用fmap f来转换tupleList,然后将zip的结果转换成intList

mainFunction :: [(a, b, c, d)] -> [Int] -> [(b, Int)]
mainFunction xs ys = zip (mapTuple xs) ys
    where f (a, b, c, d) = b
          mapTuple zs = fmap f zs

多田!让我知道是否还有其他问题。