作为练习,我将以下组合器转换为无点符号:
h f g x y z = f x (g y z)
通常使用f
,g
,h
作为函数,x
,y
,z
作为表达式。 (这不是一个家庭作业问题,只是为了好玩,看看我是否理解无点转换。)
经过ghci
辅助的漫长的手动重写过程后,我最终得到了以下内容:
h = ((flip (.)) (flip (.)) . (flip (.))) . ((.)(.))
我注意到h
只包含两个组合器,"撰写" (.)
和"反向撰写" flip (.)
。有了这个,原始的组合器可以简洁地写成:
c = (.) -- compose
r = flip c -- "reverse compose"
h = ((r r) . r) . (c c)
= c(c(r r)r)(c c)
"组成"的结构(数量和顺序)和#34;反向撰写"操作似乎与原始组合器的结构有某种关系。
我认为这与组合逻辑和SKI演算直接相关。我的问题是:
有更多洞察力的人可以解释一下这里发生了什么:"的结构如何构成"和#34;反向撰写"在与无点组合器中的函数和表达式结构相关的无点组合器中?
这可以推广到任意组合器(即函数的数量,表达式的数量,它们的顺序是任意的)?更具体地说,每个组合器都可以表达为" compose"并且"反向撰写",并且有一个方案来推导"撰写"的组合。和#34;反向撰写" 直接来自有点组合器的结构(即,没有经过完整的重写过程)?例如,是否可以直接从查看函数结构中直接派生\ f g x y z -> (f x y) g z
的无点版本?
c
和r
的组合逻辑中的名称是什么?
更新
似乎c
是B
组合子而r
来自B, C, K, W system CB
。但我仍然乐于更深入地了解我的问题,特别是问题1和问题2。
答案 0 :(得分:2)
首先,通过直接操作以组合形式推导定义通常更容易:
h f g x y z = f x (g y z)
= B(fx)(gy)z -- B rule
= B(B(fx))gyz -- B rule
h f g x = B(B(fx))g -- eta-contraction
= BBB(fx)g -- B rule
= B(BBB)fxg -- B rule
= C(B(BBB)f)gx -- C rule
h f = C(B(BBB)f) -- eta-contraction
= BC(B(BBB))f -- B rule
h = BC(B(BBB)) -- eta-contraction
-- = B(B(CB(CB))(CB))(BB) -- your expression
类型是相同的,虽然我的表达更短。这可以作为一个反例,说明组合形式是否应该以某种方式遵循给定的定义?规则的应用方式有相当大的自由度,因此可以得出各种各样的形式。我不认为从给定的组合表达可以得出很多洞察力。
如果有的话,出现在最终翻译中的组合子更能代表推导步骤,并且可以在任何给定点适合的那些中自由选择。
例如,通常在导出表达式时采用以下步骤:
g(fx) = Bgfx = CBfgx
B (B (CB(CB)) (CB)) (BB) f g x y z
= B (CB(CB)) (CB) (BB f) g x y z
= CB (CB) (CB (BB f)) g x y z -- and here
= CB (BB f) (CB g) x y z -- here
= CB g (BB f x) y z -- here
= BB f x (g y) z
= B (f x) (g y) z
= f x (g y z)
但是,如果您优先考虑规则应用程序并使其具有确定性,则应始终得出相同的结果 - 这取决于您应用规则的顺序。