Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Однако мы можем исключить [| ... |], а также сделать код более безопасным по типу, взяв 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