2017-01-05 5 views
11

このHaskellプログラムでは、@@は、関数本体fの中でローカルにのみ定義したい中置演算子です。 (当然のことながら、私の実際のプログラムは、これ以上複雑であり、中置記法を使用するには十分な理由がある。)Haskellの局所中置演算子定義

infixl 5 @@ 

(@@) = undefined 

f x = x @@ 5 where x @@ y = (x+1) * (y+1) 

main = print (f 7) 

しかし、私も(@@) = undefinedとしてここに書かれたグローバルな定義を作る場合を除き、GHCは、と文句を言い@@の固定署名には付随するバインディングがありません。演算子シンボルのグローバルな定義なしでこれを取得する方法はありますか?ただ、where句で固定性宣言を置く

+1

はあなた 'infixl 5 @@'、実際に現地に適用されている '(@@)'ですか?それは – jberryman

+0

のように見えるバグでなければならないので、 – jberryman

答えて

16

が正常に動作するようです:

f x = x @@ 5 where 
    infixl 5 @@ 
    x @@ y = (x+1) * (y+1) 
+2

のように見えます。 Haskellの2010年のレポートによれば、どこでもブロックに固定宣言を入れることは100%合法です。驚くべきことだが、本当である。 – MathematicalOrchid

+0

ああ、私はそれを考えなかった! –

+0

...コンパイラライターとして、それを実装することを夢中にしていないか、それをやろうとしていて、間違ったときに妥当なエラーメッセージを生成するので、私はそれを考えなかったと思います。もちろんそれはできますが、私よりも若々しい熱意を持っている人にとってはうってつけの仕事です。 –

関連する問題