如何以无点(point-free)方式实现三元组前两元素相乘函数?
结论
该函数的无点实现完全存在,有多种实现方式。
易读版本(推荐用于学习理解)
借助Control.Arrow中的(&&&)组合子,配合三元组投影函数fst3、snd3即可写出清晰的无点代码:
import Control.Arrow ((&&&)) import Data.Tuple.Extra (fst3, snd3) f = uncurry (*) . (fst3 &&& snd3)
逻辑说明:
(&&&)会对同一个输入先后执行两个传入的函数,将结果打包为二元组,这里就是把三元组的前两个元素取出来拼成二元组- 之后用二元组的无点乘法逻辑
uncurry (*)处理得到的二元组,就能得到最终结果
纯基础组合子版本(仅用于理论验证)
如果不允许使用任何自定义或第三方的三元组工具函数,只用Prelude自带的基础组合子也可以实现无点写法,只是可读性会非常差,仅做理论展示:
f = (.) <$> (*) . ($ ()) . (.) (.) const <*> ($ ()) . (.) (.) (const .) const
这个实现没有用到任何模式匹配逻辑,完全通过基础函数组合实现了需求。
额外说明
无点风格的核心价值是简化逻辑、降低认知成本,你原本的模式匹配写法在这个场景下已经足够清晰简洁,实际开发中完全没必要刻意替换为无点版本。
内容的提问来源于stack exchange,提问作者bereal
相关产品推荐
相关产品推荐

