作为练习,我将以下组合器转换为无点表示法:
h f g x y z = f x (g y z)
f
, g
,h
作为函数, x
, y
,z
作为表达式的通常约定。(这不是作业问题,只是为了好玩,看看我是否理解无点转换。)
在 的帮助下进行了漫长的手动重写过程后ghci
,我得到了以下结果:
h = ((flip (.)) (flip (.)) . (flip (.))) . ((.)(.))
我注意到h
它只包含两个组合器, "compose"(.)
和 "reverse compose" flip (.)
。有了这个,原始的组合子可以简洁地写成:
c = (.) -- compose
r = flip c -- "reverse compose"
h = ((r r) . r) . (c c)
= c(c(r r)r)(c c)
“组合”和“反向组合”操作的结构(数量和顺序)似乎与原始组合器的结构有某种关联。
我认为这与组合逻辑和 SKI 演算直接相关。我的问题是:
有更多洞察力的人可以解释这里发生了什么:无点组合器中“组合”和“反向组合”的结构与有点组合器中的函数和表达式结构有什么关系?
这可以推广到任意组合器(即,函数的数量,表达式的数量,它们的顺序是任意的)吗?更具体地说,每个组合子都可以用“compose”和“reverse compose”来表达吗,有没有一种方案可以直接从pointful combinator的结构中推导出“compose”和“reverse compose”的组合(即,没有经历完整的重写过程)?例如,是否可以直接
\ f g x y z -> (f x y) g z
从函数结构中得出无点版本?c
和的组合逻辑叫什么名字r
?
更新:
这似乎c
是B
组合子,r
来自CB
B 、C、K、W 系统。但我仍然很乐意更深入地了解我的问题,尤其是问题 1 和问题 2。