使用组合来获得部门的上限
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 .: (/)
我正在学习 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 .: (/)