前綴運算符很好的一個重要原因是它們可以避免使用括號,因此+ - 10 1 2
明確表示(10 - 1) + 2
。如果parens被丟棄,中綴表達式變得模糊不清,你可以通過具有某些優先規則來消除這種情況,但這很麻煩,等等,等等等等。Haskell:獲得無括號的前綴運算符
我想使Haskell使用前綴操作,但我所見過的唯一方法是通過消除括號來實現這種收益。
Prelude> (-) 10 1
使用兩個parens。
當您嘗試撰寫功能,因爲
Prelude> (+) (-) 10 1 2
產生錯誤它會變得更糟,我相信,因爲它試圖喂減法運算進入加操作,而不是首先評估負,然後feeding- - 現在你需要更多的parens!
有沒有辦法讓Haskell智能地評估前綴符號?我想,如果我做了的功能,如
Prelude> let p x y = x+y
Prelude> let m x y = x-y
我會恢復較少括號初始收益,但功能成分仍然是一個問題。如果有一種巧妙的方法可以將它與$
表示法聯繫起來,使其至少接近我的意願,我就沒有看到它。如果有一個完全不同的戰略可用,我會很高興聽到它。
我試圖重現什麼公認的答案在這裏做的:
Haskell: get rid of parentheses in liftM2
但在這兩種前奏控制檯和一個Haskell腳本,導入命令沒有工作。此外,這是Haskell比我能夠理解的更先進,所以我希望無論如何可能還有其他更簡單的解決方案,然後再進行繁重的調查來調查此類操作。
這不能真正做到,並不是真的有必要。使用更多'let's讓表達更具可讀性。 – Ryan
對於'(+)( - )10 1 2'來說,你需要查找多少個參數'( - )'和'(+)'才能解析。與需要知道固定相比,這看起來更加痛苦。哦,這會造成含有一元'-'的歧義。 – Alec
爲什麼地球上你想使用前綴符號而不是爲它設計的語言?即使它有某種可能性(例如通過quasiquotation或TH),它也只會導致非常單一的代碼。 – chi