Haskell 无点组合器中的模式,与SKI演算有何关系
作为练习,我将以下combinator转换为无点表示法:Haskell 无点组合器中的模式,与SKI演算有何关系,haskell,lambda-calculus,pointfree,combinatory-logic,Haskell,Lambda Calculus,Pointfree,Combinatory Logic,作为练习,我将以下combinator转换为无点表示法: 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”翻转(
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”翻转(.)
。这样,原始combinator可以简洁地写成:
c = (.) -- compose
r = flip c -- "reverse compose"
h = ((r r) . r) . (c c)
= c(c(r r)r)(c c)
“组合”和“反向组合”操作的结构(数量和顺序)似乎在某种程度上与原始组合器的结构有关
我认为这与组合逻辑和SKI演算直接相关。因此,我的问题是:
\f g x y z->(f x y)g z
c
和r
的名称是什么似乎
c
是B
组合器,r
是CB
。但我仍然很乐意深入了解我的问题,特别是问题1和问题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)
但是,如果您对规则应用程序进行优先级排序并使其具有确定性,那么您应该始终得到相同的结果——这取决于您应用规则的顺序 如果一个变量在rhs上出现不止一次,则B和CB不再足够(需要例如S)。如果一个变量根本没有出现,那么它们对于2来说也是不够的(需要例如K),括号抽象是SKI的一个简单算法。你可以找到augustss提到的括号变换(我想)。augustss:非常有趣,谢谢。关于组合微积分,有什么好的介绍性文章可以学习?威尔:谢谢你的参考。操作组合形式确实比我的有点到无点转换过程简单得多(我有大约三倍的中间步骤)。但是,遗憾的是,显式转换似乎仍然是必要的。我希望组合形式的结构与有点形式直接相关。如果不是一般情况,至少对于特殊情况,例如
f_{0,n_0}f_{1,n_1}。。。f{K-1,n{K-1}
,其中f{i,n}:=f{i xiu 0 xiu 1。。。xi{n-1}
(即,K
函数f_0,…,f_K
,每个函数都有一个相互不相交的变量[xiu 0,…,xi_{n-1}])。这似乎与所采取的转换步骤直接相关。