我有一个元组[(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)]
。谢谢
答案 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
此签名意味着fmap
从a -> 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
多田!让我知道是否还有其他问题。