在学习Haskell的时候,我遇到了一个挑战,要找到两个函数f和g,使得f g和f . g是等价的(并且是total的,因此像f = undefined或f = (.) f这样的东西不算)。给出的解决方案是f和g都等于\x -> x . x(或join (.))。
(我注意到这不是特定于Haskell的;它可以用纯组合逻辑表示为“找到f和g,使得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)(简化右侧)
接下来我不知道该怎么做。在尝试找到解决方案时,我该怎么做?
(我注意到这不是特定于Haskell的;它可以用纯组合逻辑表示为“找到f和g,使得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)(简化右侧)
接下来我不知道该怎么做。在尝试找到解决方案时,我该怎么做?
f
为恒等函数,g
为任意函数。则有id g = g = id . g
。 - Rein Henrichs