Как мне указать, что я хочу, чтобы что-то присутствовало в 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) = ...