Синтаксис для построения / объединения списков - PullRequest
13 голосов
/ 13 апреля 2011

Я был в Haskell только два дня, и мне было интересно, в чем разница между двумя приведенными ниже определениями функций:

Prelude> let swap (x1:x2:xs) = x2:x1:xs
Prelude> swap [1..5]
[2,1,3,4,5]
Prelude> let swap' (x1:x2:xs) = [x2] ++ [x1] ++ xs
Prelude> swap' [1..5]
[2,1,3,4,5]

То есть, чем x2: x1: xs отличается от[x2] ++ [x1] ++ xs?Пожалуйста и спасибо.

Ответы [ 2 ]

30 голосов
/ 13 апреля 2011

Типовые подписи - хорошее место для начала:

(:) :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]

Вы можете узнать это с помощью :type (:) и :type (++) в ghci.

Как видно из сигнатур типов, оба используются для создания списков.

Оператор : используется для построения списков (и для их повторного разбора для сопоставления с образцом). Чтобы создать список [1,2,3], вы просто создаете его с помощью 1 : 2 : 3 : []. Первый элемент : - это элемент, который нужно добавить в начало списка, а второй элемент - это либо список (также созданный с помощью :, либо пустой список, обозначенный []).

Оператор ++ является списком списков. Он берет два списка и добавляет их вместе. [1,2,3] ++ [4,5,6] является законным, тогда как 1 ++ [1,2,3] не является.

5 голосов
/ 13 апреля 2011

Это не имеет ничего общего с синтаксисом.(:) и (++) просто разные операторы.(:) - это конструктор, который создает список из элемента и другого списка.(++) создает новый список, который является объединением двух списков.Поскольку (++) не является конструктором, его нельзя использовать в шаблонах.

Теперь мы подошли к синтаксису: используемая вами нотация

[x2]

является сокращением для

x2:[]

Итак, что вы действительно сделали во втором примере:

(x2:[]) ++ (x1:[]) ++ xs

Следовательно, при построении списка вы не можете избежать (:), это в конечном итоге единственный способсделай это.Обратите внимание, что вы должны создать промежуточные списки, чтобы иметь возможность использовать (++).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...