2017-01-05 61 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抱怨'@@的固定性簽名缺少相應的綁定。'如果沒有運營商符號的全局定義,有沒有什麼辦法可以解決這個問題?

+1

是您的'infixl 5 @@'實際上被應用到本地'(@@)'?因爲這應該是一個錯誤,我認爲 – jberryman

+0

看起來不是 – jberryman

回答

16

只是把固定性聲明where子句中似乎很好地工作:

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

我正要發佈這個。根據哈斯克爾2010年報告,將固定聲明放在某個區塊是100%合法的。令人驚訝,但確實如此。 – MathematicalOrchid

+0

哦,我沒有想到! –

+0

...我想我沒有想到它,因爲作爲一個編譯器編寫者,我不會喜歡實現它,或者嘗試去做,並在出錯時生成合理的錯誤消息。當然這可以做到,但對於比我擁有更多年輕熱情的人來說,這是一份工作。 –