我想编写一个获取输入参数XS的函数,该函数代表形式的列表(a,b,cs(,然后将其转换为元组列表(a*b,b c(,对于A和B表示整数和CS中的所有元素C,CS代表数字列表。
结果应仅包括元组的第一个元素更大但不超过其第二个元素的元素。
示例:
[(13,25,[1,12,101]), (5,6,[7,17,27])]
-- should be converted to
[(325,26),(325,37),(325,126),(30,13)]
更新:经过大量测试后,我找到了这个解决方案,但是我不确定如何删除与结果列表中不符合要求的元组:
convert :: [(Int, Int, [Int])] -> [(Int, Int)]
convert xs = [(a*b,b+c) | (a,b,cs) <- xs, c <- cs]
您只需要在第三个元素上进一步迭代即可。此外,我们应该在列表忽略的"正文"中添加 filter 被检查的布尔表达式,以便只添加满足此条件的项目:
convert xs :: (Num a, Ord a) => [(a, a, a)] -> [(a, a, a)]
convert xs = [ (a*b,b+c) | (a, b, cs) <- xs, c <- cs, a*b > b+c ]
因此,我们将原始列表中的元组打开xs
中的元组,然后使用cs
(元组的第三个项目(作为第二个生成器的来源。
例如:
Prelude> convert [(13,25,[1,12,101]), (5,6,[7,17,27])]
[(325,26),(325,37),(325,126),(30,13),(30,23)]
或我们可以使用 filter :: (a -> Bool) -> [a] -> [a]
:
convert xs :: (Num a, Ord a) => [(a, a, a)] -> [(a, a, a)]
convert xs = filter (uncurry (>)) [ (a*b,b+c) | (a, b, cs) <- xs, c <- cs ]