如何将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
相关产品推荐
相关产品推荐

