所以我有一个元组列表,并且想对元组列表中的每个元组做一个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一起使用)? 感谢您的帮助
答案 0 :(得分:2)
您的where
的作用范围是列表理解范围外部。列表理解之外的c
和d
实际上是未定义的。
但是我认为您使这个问题过于复杂。您可以将加法简单地放在列表理解的头部:
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]
另一种选择是定义一个映射函数,将a
和b
添加到元素,例如:
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+))