You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以无点(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:06:03