找到 Haskell 函数 f, g 使得 f g = f 。 G
Find Haskell functions f, g such that f g = f . g
在学习 Haskell 时,我遇到了一个挑战,即找到两个函数 f
和 g
,使得 f g
和 f . g
等价(和总数,因此 f = undefined
或 f = (.) f
之类的不算数)。给出的解决方案是 f
和 g
都等于 \x -> x . x
(或 join (.)
)。
(我注意到这不是 Haskell 特定的;它可以用纯组合逻辑表示为 "find f
and g
such that f g = B f g
",然后给定的解决方案将转换为 f = g = W B
。 )
我明白为什么当我展开给定的解决方案时它会起作用,但我不明白如果你不知道它是如何找到它的。这是我能走多远:
f g = f . g
(给定)
f g z = (f . g) z
(双方的eta展开)
f g z = f (g z)
(简化RHS)
而且我不知道如何从那里着手。接下来我会怎么做才能找到解决方案?
我发现考虑丘奇数计算可以找到一族解。在 Church 编码中,乘法是通过组合 Church 数来执行的,求幂是通过将基数应用于指数来执行的。因此,如果 f
是某个数字 x
的 Church 编码,而 g
是某个数字 y
的 Church 编码,那么 f g = f . g
意味着 y^x = x*y
.这个方程的任何非负整数解都转化为原始问题的解。示例:
x=1, y=0, f=id, g=const id
x=1, y=1, f=id, g=id
x=1, y=2, f=id, g=join (.)
- 因为
y^1 = y = 1*y
代表所有 y
,所以 f=id
适用于所有教会数字 g
是有道理的。确实如此,事实上,正如 Rein Henrichs 所指出的,对所有 g
都是如此,而且这很容易通过检查来验证。
x=2, y=0, f=join (.), g=const id
x=2, y=2, f=join (.), g=join (.)
x=3, y=0, f=(.) <*> join (.), g=const id
- 因为
0^x = 0 = x*0
代表所有正数 x
,所以 g=const id
适用于所有正数 Church 数字 f
是有道理的。 (它不适用于 f=const id
,教会数字 0,这是有道理的,因为 0^0
是一个不确定的形式。)
在学习 Haskell 时,我遇到了一个挑战,即找到两个函数 f
和 g
,使得 f g
和 f . g
等价(和总数,因此 f = undefined
或 f = (.) f
之类的不算数)。给出的解决方案是 f
和 g
都等于 \x -> x . x
(或 join (.)
)。
(我注意到这不是 Haskell 特定的;它可以用纯组合逻辑表示为 "find f
and g
such that f g = B f g
",然后给定的解决方案将转换为 f = g = W B
。 )
我明白为什么当我展开给定的解决方案时它会起作用,但我不明白如果你不知道它是如何找到它的。这是我能走多远:
f g = f . g
(给定)f g z = (f . g) z
(双方的eta展开)f g z = f (g z)
(简化RHS)
而且我不知道如何从那里着手。接下来我会怎么做才能找到解决方案?
我发现考虑丘奇数计算可以找到一族解。在 Church 编码中,乘法是通过组合 Church 数来执行的,求幂是通过将基数应用于指数来执行的。因此,如果 f
是某个数字 x
的 Church 编码,而 g
是某个数字 y
的 Church 编码,那么 f g = f . g
意味着 y^x = x*y
.这个方程的任何非负整数解都转化为原始问题的解。示例:
x=1, y=0, f=id, g=const id
x=1, y=1, f=id, g=id
x=1, y=2, f=id, g=join (.)
- 因为
y^1 = y = 1*y
代表所有y
,所以f=id
适用于所有教会数字g
是有道理的。确实如此,事实上,正如 Rein Henrichs 所指出的,对所有g
都是如此,而且这很容易通过检查来验证。 x=2, y=0, f=join (.), g=const id
x=2, y=2, f=join (.), g=join (.)
x=3, y=0, f=(.) <*> join (.), g=const id
- 因为
0^x = 0 = x*0
代表所有正数x
,所以g=const id
适用于所有正数 Church 数字f
是有道理的。 (它不适用于f=const id
,教会数字 0,这是有道理的,因为0^0
是一个不确定的形式。)