使用构图来获得分区的上限



我正在学习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 .: (/)

相关内容

  • 没有找到相关文章

最新更新