使用组合来获得部门的上限

Using composition to get ceiling of a division

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

这是我要重构的函数:

ceilingDiv a b = ceiling (a / b)

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

ceilingDiv = curry $ ceiling . uncurry (/)

有没有办法更干净地做到这一点?我在想 ceiling . div,但它不起作用,因为 (/) returns 一个函数和 ceiling 以 Double 作为参数。

有一个名为 https://pointfree.io - it provides a solution to your problem like this: ceilingDiv = (ceiling .) . (/). It looks ugly because point-free composition with multiple arguments is a pain. Sometimes it's achieved by using . sections like here, sometimes by using an Applicative 函数实例和 <*> 运算符的有趣网站。

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

具有多个参数的作文通常最好只保留点形式。 None 的备选方案同样清晰明了。务必使用组合和分组运算符,但不要仅仅为了它而回避争论。

ceilingDiv a b = ceiling $ a/b

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

ceilingDiv a = ceiling . (a/)

但我会保留它。即便如此,IMO 也不如原始的 2 参数形式干净,因为需要对除法运算符进行分段。

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

ceilingDiv = ceiling .: (/)