我正在学习haskell,并试图使用仅组合重写函数
以下是我试图重构的函数:
ceilingDiv a b = ceiling (a / b)
到目前为止,我设法用咖喱和Unrry让它发挥作用,但它感觉很脏:
ceilingDiv = curry $ ceiling . uncurry (/)
有什么方法可以做得更干净吗?我在想ceiling . div
,但它不起作用,因为(/)
返回一个函数,而天花板将Double作为其参数。
有一个有趣的网站https://pointfree.io-它为您的问题提供了这样的解决方案:ceilingDiv = (ceiling .) . (/)
。它看起来很难看,因为有多个论点的无点作文很痛苦。有时它是通过使用.
部分来实现的,比如这里,有时通过使用函数的Applicative实例和<*>
运算符来实现。
我认为你的咖喱汁很不错。它通过将多个参数包装成一个元组来处理传递多个参数的问题。
带有多个参数的组合通常最好保持完整的形式。没有一个替代方案是干净明了的。一定要使用组合运算符和分组运算符,但不要仅仅为了它而放弃争论
ceilingDiv a b = ceiling $ a/b
你当然可以做的是eta减少b
参数
ceilingDiv a = ceiling . (a/)
但我还是到此为止。即使这样,IMO也不如原来的2参数形式干净,因为除法运算符需要分段。
当直接将组合传递给更高阶的函数时,为了避免lambda绑定,可以更友好地实现无点目标。composition
包有一大堆运算符,用于使用更多参数进行组合。在这种情况下,您可以使用非常简洁的
ceilingDiv = ceiling .: (/)