使用组合来获得除法的上限

Ist*_*hos 3 haskell currying function-composition

我正在学习 haskell,并且我正在尝试仅使用组合来重写函数

这是我试图重构的函数:

ceilingDiv a b = ceiling (a / b)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我设法使用 curry 和 uncurry 使其工作,但感觉很脏:

ceilingDiv = curry $ ceiling . uncurry (/)
Run Code Online (Sandbox Code Playgroud)

有什么办法可以更干净地做到这一点吗?我在想ceiling . div,但它不起作用,因为(/)返回一个函数,而上限接受 Double 作为其参数。

Mor*_*orJ 7

有一个有趣的网站,名为https://pointfree.io - 它为您的问题提供了一个解决方案,如下所示:ceilingDiv = (ceiling .) . (/)。它看起来很难看,因为具有多个参数的无点组合是一种痛苦。有时它是通过使用像这里这样的. 部分来实现的,有时是通过使用函数和运算符的Applicative<*>实例来实现。

我认为你的 curry-uncurry 解决方案很好。它通过将多个参数包装到一个元组中来传递多个参数。


lef*_*out 6

具有多个参数的文章通常最好保留有重点的形式。没有一个替代方案是那么干净和清晰。一定要使用组合和分组运算符,但不要仅仅为了争论而回避争论。

ceilingDiv a b = ceiling $ a/b
Run Code Online (Sandbox Code Playgroud)

你当然可以做的是 eta-reduceb参数

ceilingDiv a = ceiling . (a/)
Run Code Online (Sandbox Code Playgroud)

但我就这样吧。即使这样,在我看来也比原来的 2 参数形式更不干净,因为除法运算符需要被分段。

当直接将组合传递给高阶函数时,更积极地实现无点以避免 lambda 绑定是有意义的。该composition有一大堆运算符用于组合更多参数。在这种情况下,您可以使用确实非常简洁的

ceilingDiv = ceiling .: (/)
Run Code Online (Sandbox Code Playgroud)