У меня есть небольшая функция Эрланга, которая сравнивает, если два списка равны:сопоставления с образцом в Haskell и Erlang
myEq([], []) -> true;
myEq([X|Xs], [X|Ys]) -> myEq(Xs, Ys);
myEq(_, _) -> false.
Сравнение происходит на линии 2, X
из [X|Xs]
всегда связывается с первым элементом первый список, [X|Ys]
соответствует только в том случае, если первые элементы обоих списков равны.
Если я попробую это в Haskell, я получаю сообщение об ошибке: «Конфликтующие определения для x
». Возможное решение в Haskell будет:
myEq (x:xs) (y:ys) = if x == y then myEq xs ys else False
Но я хотел бы знать, если это возможно сделать в Haskell, используя поиск по шаблону?
Чтобы уточнить: Эрланг тоже не делает унификации. Если переменная встречается несколько раз в шаблоне, компилятор Erlang просто генерирует новые имена для других вхождений и вставляет защитный тест, который требует, чтобы они были равны, точно так же, как вы делали вручную в Haskell. – RichardC
@RichardC: Я переписал ответ на * объединение * и * проверки равенства *. Считаете ли вы, что это лучше справляется с этой проблемой? –
Да, это выглядит лучше. – RichardC