Проверьте, соответствует ли переменная Haskell пользовательскому типу данных - PullRequest
5 голосов
/ 26 октября 2011

Итак, у меня есть тип данных вроде:

data Token = NUM Int | ID String | EOF

, и у меня есть функция вроде:

doStuff list = let
       (token, rest) = getToken list
   in
       ....

Итак, что я хочу сделать в ... часть - это проверка, если полученный токен - NUM или INT или EOF.Я могу сказать token==EOF, чтобы проверить для этого случая, но я не могу найти способ проверить, является ли токен NUM или INT, используя условное выражение, поскольку token==(NUM n) и token==NUM оба приводят кошибки.Я знаю, что мог бы написать вспомогательную функцию для выполнения вещи в ... и воспользоваться преимуществами сопоставления с образцом, но это действительно ухудшает читабельность того, что я делаю, и кажется, что должен быть способ сделать этопроверять.Кто-нибудь знает как?

Ответы [ 2 ]

12 голосов
/ 26 октября 2011

Вы хотите выражение case, например:

case token of
    NUM n -> foo n
    ID s  -> bar s
    _     -> hoho

Это тот же тип сопоставления с шаблоном, который вы получили бы, если бы вы определили функцию отдельно.

8 голосов
/ 26 октября 2011

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

case token of
    NUM {} -> ...
    ID  {} -> ...
    EOF {} -> ...
...