我正在學習 Haskell,我正在嘗試僅使用組合來重寫一個函式
這是我試圖重構的函式:
ceilingDiv a b = ceiling (a / b)
到目前為止,我設法使用 curry 和 uncurry 使其作業,但感覺很臟:
ceilingDiv = curry $ ceiling . uncurry (/)
有沒有辦法更干凈地做到這一點?我在想ceiling . div,但它不起作用,因為(/)回傳一個函式,而天花板將 Double 作為其引數。
uj5u.com熱心網友回復:
有一個有趣的網站叫https://pointfree.io -它提供了一個解決問題的方法是這樣的:ceilingDiv = (ceiling .) . (/)。它看起來很難看,因為帶有多個引數的無點組合很痛苦。有時它是通過使用像這里這樣的. 部分來實作的,有時是通過使用函式和運算子的Applicative實體來實作的<*>。
我認為你的 curry-uncurry 解決方案很好。它通過將多個引數包裝成一個元組來處理傳遞多個引數。
uj5u.com熱心網友回復:
具有多個引數的組合通常最好以點式形式保留。沒有一個替代方案是干凈和清晰的。一定要使用組合和分組運算子,但不要僅僅為了它而放棄爭論。
ceilingDiv a b = ceiling $ a/b
你當然可以做的是 eta-reduceb論點
ceilingDiv a = ceiling . (a/)
但我會離開它。即便如此,IMO 也沒有原始的 2 引數形式那么干凈,因為需要對除法運算子進行分段。
當直接將組合傳遞給高階函式時,可以更積極地瞄準無點,以避免 lambda 系結。該composition包有一大堆運算子用于組合更多引數。在這種情況下,您可以使用確實非常簡潔的
ceilingDiv = ceiling .: (/)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316804.html
下一篇:在Haskell中輸出多個檔案
