我寫了一個函數來評估給定數量的多項式。多項式被表示爲係數列表(例如,[1,2,3]
對應於x^2+2x+3
)。擺脫不必要的括號
polyEval x p = sum (zipWith (*) (iterate (*x) 1) (reverse p))
正如您所看到的,我首先使用了大量的括號來對應對哪些表達式進行評估。爲了更好的可讀性,我嘗試使用.
和$
消除儘可能多的括號。 (在我看來,兩對以上的嵌套括號使得代碼越來越難以閱讀。)我知道函數應用程序具有最高的優先級並且保持關聯。該.
和$
都是右結合的,但.
優先9,而$
優先0
所以,在我看來,下面的表達式不能用更少括號寫
polyEval x p = sum $ zipWith (*) (iterate (*x) 1) $ reverse p
我知道我們需要括號(*)
和(*x)
將它們轉換爲前綴函數,但有可能以某種方式刪除圍繞iterate (*x) 1
的括號嗎?
另外你還喜歡哪種版本的可讀性?
我知道還有很多其他的方法可以達到同樣的效果,但我想討論一下我的特殊例子,因爲它有一個函數在兩個參數(iterate (*x) 1)
中作爲另一個帶有三個參數的函數的中間參數。
爲了便於閱讀,我更喜歡摺疊。順便說一句,這可以完成點:'polyEval'x = foldl'(\ b a - > a + x * b)0'。 – Alec
@Alec我剛剛更新了我的問題:我構造了這個特殊的例子,因爲你有一個函數在兩個參數中作爲另一個參數進行評估,並且希望討論這個特定的例子。 (順便說一句:你的函數並不是完全沒有點的自由,因爲你明確地使用lambda的參數) – flawr
假設一個代碼結構保持原樣,我認爲'... where powers = iterate(* x)1'會幫幫我。我會使用'polyEval x = sum。 zipWith(*)權力。 reverse' – chi