找到 Haskell 函数 f, g 使得 f g = f 。 G

Find Haskell functions f, g such that f g = f . g

在学习 Haskell 时,我遇到了一个挑战,即找到两个函数 fg,使得 f gf . g 等价(和总数,因此 f = undefinedf = (.) f 之类的不算数)。给出的解决方案是 fg 都等于 \x -> x . x(或 join (.))。

(我注意到这不是 Haskell 特定的;它可以用纯组合逻辑表示为 "find f and g such that f g = B f g",然后给定的解决方案将转换为 f = g = W B。 )

我明白为什么当我展开给定的解决方案时它会起作用,但我不明白如果你不知道它是如何找到它的。这是我能走多远:

而且我不知道如何从那里着手。接下来我会怎么做才能找到解决方案?

我发现考虑丘奇数计算可以找到一族解。在 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 是一个不确定的形式。)