Я пытаюсь выучить какой-нибудь шаблон 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 |] ) []
]
Проблема в том, что она работает только с конструкторами с одним аргументом.Виновником является шаблон conP nam [wildP]
.В идеале это должно выглядеть как conP nam (replicate (numArgs nam) wildP)
, где numArgs
- это функция, возвращающая количество аргументов конструктора.Но как мне написать такую функцию?Я предполагаю, что мне нужно получить доступ к соответствующему объявлению данных, но я не знаю, как это сделать.
Есть еще один вопрос об этой самой функции здесь .