将常量添加到元组列表

时间:2018-10-18 14:09:29

标签: haskell functional-programming

所以我有一个元组列表,并且想对元组列表中的每个元组做一个a并将常量添加到列表中

类似的东西

convertingList :: (Int,Int)->[(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [(x,y) | (c,d) <- list] where x = a + c   y = b + d

我得到错误c和d不在范围内,我该如何解决这个问题? 变量不在范围内:c :: Int 变量不在范围内:d :: Int

是否可以使用更好的功能(也许与map一起使用)? 感谢您的帮助

1 个答案:

答案 0 :(得分:2)

您的where的作用范围是列表理解范围外部。列表理解之外的cd实际上是定义的。

但是我认为您使这个问题过于复杂。您可以将加法简单地放在列表理解的头部:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [(a + c, b + d) | (c,d) <- list]

或者您可以使用let表达式:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [let x = a+c; y = b+d in (x, y) | (c,d) <- list]

或者像@M.Aroosi所说的那样,我们可以将let(没有in!)移动到列表理解的正文部分:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [ (x, y) | (c,d) <- list, let x = a+c, let y = b+d]

另一种选择是定义一个映射函数,将ab添加到元素,例如:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) = map f
    where f (c, d) = (a+c, b+d)

或使用(***) :: Arrow a => a b c -> a b' c' -> a (b, b') (c, c')

import Control.Arrow((***))

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) = map ((***) (a+) (b+))