Template Haskell を学ぼうとしています。isLeft
演習として、 andのようなものを生成できる関数を作成しました (この質問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 |] ) []
]
問題は、引数が 1 つのコンストラクターでのみ機能することです。犯人はconP nam [wildP]
パターンです。理想的にconP nam (replicate (numArgs nam) wildP)
はnumArgs
、 はコンストラクタの引数の数を返す関数です。しかし、そのような関数をどのように書くのでしょうか? 関連するデータ宣言にアクセスする必要があると思いますが、その方法がわかりません。
これとまったく同じ機能について、別の質問がここにあります。