Шаблон сопоставления эквивалентных переменных в Haskell, как в Prolog - PullRequest
9 голосов
/ 04 ноября 2010

В прологе мы можем сделать что-то вроде следующего:

myFunction a (a:xs) = ...

Это когда 1-й аргумент myFunction совпадает с первым элементом списка, который находится во 2-м аргументе, эта функция оценивается как ....

Мой вопрос сейчас ... как сделать подобное в Haskell? У меня есть идея, что сопоставление с образцом в Прологе более выразительно, чем в Haskell. Я пытался закодировать это в Haskell, и у меня возникли проблемы - либо я использую неверный синтаксис, либо описанный выше трюк просто не сработает.

Ответы [ 3 ]

13 голосов
/ 04 ноября 2010

Haskell не выполняет такого рода "сопоставление переменных". Вам придется явно поставить охрану на:

myFunction a (x:xs)
    | x == a = ...
12 голосов
/ 07 мая 2011

Haskell не выполняет объединение переменных, как это делает Пролог.Как говорится в отчете Haskell 98 ,

Набор шаблонов, соответствующий каждому совпадению, должен быть линейным - ни одна переменная не может появляться более одного раза во всем наборе.

Вы, конечно, можете назвать переменные и указать, что они также должны быть равны:

f a (b:_) | a == b = ...

Интересно, что Agda позволяет потоку информации проходить по таким шаблонам, ивводит специальную запись f x (.x:_), чтобы сказать, что это x должно быть, что x.

8 голосов
/ 04 ноября 2010

В Haskell вы не можете делать неявные сравнения, подобные этому, в сопоставлении с образцом. Вместо этого вам нужно добавить охранник, который явно выполняет сравнение, например так:

myFunction a (b:xs) | a == b = ...
...