【发布时间】:2024-01-19 21:29:01
【问题描述】:
在学习 Haskell 时,我遇到了一个挑战,要找到两个函数 f 和 g,这样 f g 和 f . g 是等价的(并且总计,所以像 f = undefined 或 f = (.) f don不算)。给定的解决方案是f 和g 都等于\x -> x . x(或join (.))。
(我注意到这不是 Haskell 特有的;它可以用纯组合逻辑表示为“找到f 和g 使得f g = B f g”,然后给定的解决方案将转换为@987654334 @.)
我理解为什么当我扩展给定解决方案时它会起作用,但我不明白如果你还不知道它是如何找到它的。这是我能走多远:
-
f g = f . g(给定) -
f g z = (f . g) z(两边的eta-expansion) -
f g z = f (g z)(简化 RHS)
我不知道如何从那里着手。在尝试找到解决方案时,我接下来会做什么?
【问题讨论】:
-
也许一个开始的地方是弄清楚他们必须拥有什么类型。事实证明,要使表达式有意义,它们必须具有多态类型,这可以告诉你很多可能的实现。
-
让
f为id和g为任意函数。id g = g = id . g.
标签: haskell functional-programming lambda-calculus combinatory-logic