如何使用函数组合实现Haskell的除法向上取整函数
实现方案
你可以直接使用双层函数组合的写法完成点-free(无参数)风格的实现,比 curry/uncurry 的写法简洁很多:
ceilingDiv = (ceiling .) . (/)
原理说明
这种写法的本质是利用了函数组合的嵌套,刚好适配一元函数和二元函数的组合场景:
- 我们需要把二元函数
(/)的计算结果喂给一元函数ceiling,等价于表达式\a b -> ceiling (a / b) - 对于任意一元函数
f和二元函数g,(f .) . g展开后刚好就是\x y -> f (g x y),完全匹配你的需求 - 你也可以写成等价的
ceilingDiv = (.) ceiling . (/),和上面的写法没有任何功能差异
原有写法问题说明
你尝试的组合写法类型不匹配的原因是:(/)是柯里化的二元函数,传入第一个参数后返回的是一个等待第二个参数的一元函数,而ceiling需要接收一个实数类型的数值作为入参,自然无法直接和函数类型的值组合。
如果你的使用场景是整数参数的向上整除,也可以不用浮点运算避免精度损失,写法为:
ceilingDiv a b = (a + b - 1) `div` b
内容的提问来源于stack exchange,提问作者Isthos
相关产品推荐
相关产品推荐

