Как избавиться от $ (...) и [| ... |] синтаксис при использовании функции Template Haskell? - PullRequest
12 голосов
/ 27 августа 2011

Я пытаюсь выучить какой-нибудь шаблон Haskell.В качестве упражнения я написал функцию, которая может генерировать такие вещи, как isLeft и isRight (вдохновленный этим вопросом ).Вот моя скромная попытка:

isA connam = do
    ConE nam <- connam
    nn <- newName "p"
    lamE [varP nn] $ caseE (varE nn) [
                       match (conP nam [wildP]) ( normalB [| True |] ) [],
                       match wildP ( normalB [| False |] ) [] 
                     ]

Проблема в том, что мне нужно написать $(isA [| Left |]) вместо более интуитивного isA Left.Можно ли избавиться от уродливого синтаксиса?Я не могу найти ответ в документации.

Функция работает только с конструкторами с одним аргументом, но это для другой вопрос .

1 Ответ

11 голосов
/ 27 августа 2011

Синтаксис существует по причине;сообщить читателю, что здесь происходит волшебство времени компиляции.Вы можете исключить $(...) только тогда, когда ваше соединение находится на верхнем уровне.

Однако мы можем исключить [| ... |], а также сделать код более безопасным с помощью типа *, взяв Name вместоExp:

isA nam = do
    nn <- newName "p"
    lamE [varP nn] $ caseE (varE nn) [
                       match (conP nam [wildP]) ( normalB [| True |] ) [],
                       match wildP ( normalB [| False |] ) [] 
                     ]

Чтобы использовать это, вы должны написать $(isA 'Left), что немного проще для глаз.

В качестве бонуса, если вы попытаетесь дать егочто-то отличное от Name, вы получаете ошибку типа вместо неопровержимой ошибки сопоставления с образцом.

См. также: Синтаксис шаблона Haskell

...