Я пытаюсь изучить некоторые шаблоны 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. Можно ли избавиться от уродливого синтаксиса? Я не могу найти ответ в документации.
Функция работает только с конструкторами с одним аргументом, но это для другого вопроса.