f(x-1)
时,它是在调用f(x) = x+10
还是f(x) = if ...
我应该如何使用静态/动态分配重写它?
let fun f(x) = x + 10
in
let fun f(x) = if x < 1 then 0 else f(x-1)
in f(3)
end
end
在解决您的问题之前,这里有一些有关您的代码的观察结果:
有两个函数f
,一个在另一个内部。它们彼此不同。
为了减轻这种混乱,您可以将内部函数重命名为g
:
let fun f(x) = x + 10
in
let fun g(x) = if x < 1 then 0 else g(x-1)
in g(3)
end
end
这将按照以下规则清除哪个函数调用哪个函数:外部f
在外部in
-end
内定义,但立即由内部f
shadowed定义。因此,对内部f
右侧的fun f(x) = if ...
的任何引用都被遮盖,因为fun
启用了自递归。并且内部f
-in
中对end
的任何引用均已阴影
在下面的切向示例中,如果我们使用的是f
而不是f
,则内部声明val
的右侧确实遮蔽了外部fun
:let fun f(x) = if (x mod 2 = 0) then x - 10 else x + 10
in
let val f = fn x => f(x + 2) * 2
in f(3)
end
end
如果在第二段代码中将内部f
重命名为g
,则看起来像:
let fun f(x) = if (x mod 2 = 0) then x - 10 else x + 10 in let val g = fn x => f(x + 2) * 2 in g(3) end end
[重要的一点是被重写,因为在f(x + 2)
部分未重写为g(x + 2)
,因为val
表示对f
的引用是外部f
,而不是定义的f
,因为val
不是自递归定义。因此,在该定义内对f
的任何引用都必须取决于外部范围中是否可用。但是
g(3)
位is
in
-end
之间,内部f
(现在为g
)is阴影。因此,对于fun
-val
-let
的阴影而言,它是in
还是end
都没有关系。(还有一些详细信息,val rec
和我尚未详细说明的let val f = ...
的确切范围。
~>
表示重写,因此在这里我不是SML运算符) 。这是我的
second
示例(不是您的代码)的外观示例: g(3)
~> (fn x => f(x + 2) * 2)(3)
~> f(3 + 2) * 2
~> f(5) * 2
~> (if (5 mod 2 = 0) then 5 - 10 else 5 + 10) * 2
~> (if (1 = 0) then 5 - 10 else 5 + 10) * 2
~> (5 + 10) * 2
~> 15 * 2
~> 30
您的手工评估看起来会有所不同,并可能得出不同的结论。
我不确定使用静态/动态分配重写它的意思。您必须详细说明。