Синтаксическая ошибка Haskell в моей функции

Я попытался написать функцию, которая принимает пару списков и меняет местами элементы пары.

inverse :: [(a,b)] -> [(b,a)]
inverse [] = []
inverse (x,y):xs = (y:x): inverse xs

Я загрузил эту функцию через Prelude, она выдает следующую ошибку:

mydefs.hs:11:1: Ошибка синтаксического анализа в шаблоне: инверсия

Это строка 11, inverse (x,y):xs = (y:x): inverse xs


person anru    schedule 11.01.2015    source источник
comment
двоеточие в (y:x) до (y,x)...   -  person Willem Van Onsem    schedule 11.01.2015
comment
Лучшим способом сделать это было бы создать функцию swap (a,b) = (b,a) и создать inverse = map swap.   -  person AJF    schedule 11.01.2015
comment
Возможный дубликат Haskell: ошибка синтаксического анализа в шаблоне   -  person Chris Martin    schedule 06.09.2017


Ответы (1)


Вам просто нужно окружить распакованный кортеж и остальную часть списка, например

inverse ((x, y):xs) = (y, x) : inverse xs

Кроме того, вы можете использовать Data.Tuple swap функция пакета, например

Prelude> import Data.Tuple
Prelude Data.Tuple> map swap [(1, 2), (3, 4)]
[(2,1),(4,3)]
person thefourtheye    schedule 11.01.2015