Ваш where
ограничен вне списка понимания.Вне списка понимание c
и d
действительно не определено.
Но я думаю, что вы делаете эту проблему слишком сложной.Вы можете просто добавить сложение в заголовок списка:
convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [(<b>a + c</b>, <b>b + d</b>) | (c,d) <- list]
или вы можете использовать выражение let
:
convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [<b>let</b> x = a+c; y = b+d in (x, y) | (c,d) <- list]
или как @ M.Aroosi говорит, что мы можем переместить let
s (без in
!) В часть тела понимания списка:
convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [ (x, y) | (c,d) <- list, <b>let</b> x = a+c, <b>let</b> 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+))