Да, вы не можете выполнить сопоставление с образцом в лямбде, не используя \ x -> case x of ... (или LambdaCase, чтобы сократить его); ваш пример:
[2*x | (x,2) <- [(1,2), (3,4)]]
должно быть реализовано как:
map (\(x,_) -> 2*x) $ filter (\(_,y) -> y == 2) [(1,2), (3,4)]
Или, используя LambdaCase:
map (\(x,_) -> 2*x) $ filter (\case (_,2) -> True; _ -> False) [(1,2), (3,4)]
Также, для бессрочной версии:
map ((2*) . fst) $ filter ((==2) . snd) [(1,2), (3,4)]