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

如何将m元函数与n元函数合并为返回结果对的(m+n)元函数?

关于无点风格实现多函数参数组合的疑问

我不确定这种应用有多大用处,但因我的一个StackOverflow问题的C++回答(对应问题:Can currying be implemented via coroutines)产生了好奇。

例如,给定三元函数f和二元函数g:

f x y z = x + 10*y + 100*z
g x y = x + 10*y

如何得到函数h满足以下条件?

h f g 1 2 3 4 5 == (321, 54)

显然可以这样定义:

h f g = \x y z v w -> (f x y z, g v w)

但我好奇的是,是否能通过现有抽象,以**无点风格(point-free style)实现任意元数m和n**的情况。

对于m == 3 && n == 2这个特定例子,pointfree.io给出的结果可读性极差:

h = flip . ((flip . ((flip . (((.) . (.) . (,)) .)) .)) .)

但我仍想知道是否存在其他实现方式。

出于兴趣,我尝试用组合子逻辑(combinatory logic)机械推导公式,但仅针对m == 3 && n == 2的特定情况:

b = (.)  -- bluebird (names from "To Mock a Mockingbird")
c = flip -- cardinal (names from "To Mock a Mockingbird")
p = (,)
f x y z = x + 10*y + 100*z
g x y = x + 10*y
{- 
p(fxyz)(gvw) = ?xyzvw, with ? in terms of p, f, g and known birds
(p(fxyz))(gvw)
B(B(p(fxyz)))gvw
CBg(B(p(fxyz)))vw
B(CBg)B(p(fxyz))vw
B(B(CBg)B)p(fxyz)vw
B(B(B(CBg)B)p)(fxy)zvw
B(B(B(B(CBg)B)p))(fx)yzvw
B(B(B(B(B(CBg)B)p)))fxyzvw
B(B(B(B(B(CBB)(CB)g)p)))fxyzvw
B(B(B(BB(B(CBB)(CB))gp)))fxyzvw
B(B(BB(BB(B(CBB)(CB))g)p))fxyzvw
B(B(B(BB)(BB(B(CBB)(CB)))gp))fxyzvw
B(BB(B(BB)(BB(B(CBB)(CB)))g)p)fxyzvw
BB(BB(B(BB)(BB(B(CBB)(CB)))g))pfxyzvw
B(BB)(B(BB)(B(BB)(BB(B(CBB)(CB)))))gpfxyzvw
C(C(B(BB)(B(BB)(B(BB)(BB(B(CBB)(CB))))))p)fgxyzvw
-}
h = c (c (b (b b) (b (b b) (b (b b) (b b (b (c b b) (c b)))))) p)
h f g 1 2 3 4 5 == (321, 54) -- True

内容的提问来源于stack exchange,提问作者Enlico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:35:16