Как мне указать, что я хочу, чтобы что-то присутствовало в Haskell

У меня есть охрана, и условие состоит в том, что поиск x list == что-то, то есть x находится в списке. Я старался:

| lookup x list == _ = my code here

Но при загрузке функции я получаю ошибку "шаблонный синтаксис в контексте выражения"?

2 ответа

Вы бы использовать охрану, как

| any ((x ==) . fst) list = ... code ...

Вы получаете конкретное сообщение об ошибке, потому что _ не является действительным идентификатором. Знак _ допустимо только при сопоставлении с образцом, а сопоставления с образцом можно использовать только в местах, которые явно разрешают их. Шаблоны никогда не являются выражением, поэтому их нельзя использовать в любом месте, где ожидается произвольное выражение.

Если вы включите PatternGuards Расширение в GHC, вы также можете делать то, что вы хотите с синтаксисом, как:

| Just _ <- lookup x list = ... code ...

Обратите внимание, что я соответствую на Just результаты, а не все результаты. Помни что lookup все еще производит значение, когда он не находит что-то, и что _ шаблон соответствует всем значениям.

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

| Just y <- lookup x list = ... code that uses y...

Выполнение этого без защитных шаблонов потребовало бы совпадения шаблонов внутри тела, что, возможно, было бы немного неудовлетворительно.

Или, если вы обнаружите, что хотите оставить бесплатное сопоставление с образцом скрытым в библиотеке...

import Data.Maybe (fromJust)

...
    | isJust (lookup x list) = ...
Другие вопросы по тегам