转换元组



我想编写一个获取输入参数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 ]

最新更新