2

我必须解决一个 lambda 演算问题。我达到了某个点,但我不知道如何继续:

h f x = \g -> g (f x g)

(h::a1 f::a2 x::a3)::a4 = (\g -> g::a5 (f::a2 x::a3 g::a5)::a6)::a4

a1 = a2 -> a3 -> a4
a2 = a3 -> a5 -> a6
a5 = a6 -> a4

a1 = (a3 -> a5 -> a4) -> a3 -> a4
a1 = (a3 -> (a6->a4) -> a4) -> a3 -> a4

有没有办法完成?我使用“a1,a2,a3...”来表示元素或函数的类型。例如,1::Int、2.4::Float、f::a1、x::a3 等等。不知道够不够清楚...

非常感谢!!

4

1 回答 1

3

你犯了一个错误。g=a5: a6 -/-> a4.你的括号在第 2 行是错误的。

h f x = \g -> g (f x g)

(h::a1 f::a2 x::a3)::a4 = (\g -> (g::a5 (f::a2 x::a3 g::a5)::a6)::a7)::a4

a1 = a2 -> a3 -> a4
a2 = a3 -> a5 -> a6
a5 = a6 -> a7
a4 = a5 -> a7

a1 = (a3 -> a5 -> a6) -> a3 -> a4
a1 = (a3 -> (a6->a7) -> a6) -> a3 -> a5 -> a7
a1 = (a3 -> (a6->a7) -> a6) -> a3 -> (a6 -> a7) -> a7

fun h f x = (fn g => g (f x g) )因此这是 h 的正确类型(您可以通过在 SML 提示符中键入并获得完全相同的结果来检查您是否偏执;使用适当语法的 Haskell 也是如此)。h 是一个多态函数,所以所有的 a 都是任意的,但是表达了 h 的参数的类型和应用 h 的结果的参数之间的关系等等。

于 2011-08-31T13:28:26.673 回答