12

テンプレート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 |] ) [] 
                     ]

$(isA [| Left |])問題は、より直感的なものではなく、書く必要があるということisA Leftです。醜い構文を取り除くことは可能ですか?ドキュメントに答えが見つからないようです。

この関数は1つの引数のコンストラクターでのみ機能しますが、これは別の質問です。

4

1 に答える 1

11

構文には理由があります。ここでコンパイル時の魔法が起こっていることを読者に知らせます。$(...)スプライスがトップレベルにある場合にのみ削除できます。

ただし、 :の代わりにを使用することで、を削除し[| ... |]、コードをよりタイプセーフにすることができます。NameExp

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構文

于 2011-08-27T12:24:01.783 に答える