2011-08-27 2 views
12

私はTemplate Haskellを学ぼうとしています。練習として、私はisLeftisRightのようなものを生成する関数を書いた(this questionに触発されている)。

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つのコンストラクタでのみ機能しますが、これはanother questionです。

答えて

10

理由のために構文があります。ここでコンパイル時の魔法があることを読者に知らせる。スプライスが最上位にある場合にのみ$(...)を削除することができます。

しかし、我々は[| ... |]をなくすことができ、また、タイプセーフなコードより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以外のものを指定しようとすると、反駁不能なパターンマッチエラーではなくタイプエラーが発生します。

も参照してください。Template Haskell Syntax

+0

ありがとうございました。私は間違いなくそれで生きることができます。 '$'はスプライスにはもはや必要ではないということをどこかで読んでいるのを覚えていますが、私はそれがどんな文脈であったか、あるいはここで適用できるかどうかはわかりません。 –

+0

@ n.m。私はちょうど前に私の答えにそれを追加:)あなたはまだあなたのコメントを書いている間私の元の答えを表示していたと思います。 – hammar

+0

ahaなので、 'isA 'Left'が実際の関数の代わりに' isALeft'という関数の宣言を生成したいのであれば、$を省略することができますか? –

関連する問題