Functional programming 函数式编程:值的等价性和求值

Functional programming 函数式编程:值的等价性和求值,functional-programming,sml,Functional Programming,Sml,我正在读一些关于SML的笔记,对作者的一句话感到有点困惑。让e==>v指示对值的求值,并e~e' 指示e在扩展上等同于e' 作者写道: 如果e~e'(两种类型均为t)且存在ts.t.e~v)类型的SML值,则存在SML值v'(类型同样为t)、s.t.e'==>v'和v' 确保您注意到这一点(并理解为什么我们在这里没有说,如果e~e'和e~v,那么e'=>v) 为什么不呢?如果你从e和e'开始,已经是值v和v',那么第二句话会说 如果v~v”和v~v,则v'=>v 可以简化为 如果v~v',则v'

我正在读一些关于SML的笔记,对作者的一句话感到有点困惑。让
e==>v
指示对值的求值,并
e~e'
指示
e
在扩展上等同于
e'

作者写道:

如果
e~e'
(两种类型均为
t
)且存在
t
s.t.
e~v
)类型的SML值,则存在SML值
v'
(类型同样为
t
)、s.t.
e'==>v'
v'

确保您注意到这一点(并理解为什么我们在这里没有说,如果
e~e'
e~v
,那么
e'=>v


为什么不呢?

如果你从
e
e'
开始,已经是值
v
v'
,那么第二句话会说

如果
v~v
”和
v~v
,则
v'=>v

可以简化为

如果
v~v'
,则
v'=>v

这与扩展性正好相反,因为你可以

v = fn x => x + 0
v' = fn x => x

它们不是相同的值,但在扩展上是相等的。

因为这意味着两者都减少到相同的语法值。但扩展相等与语法相等不同。它大致上意味着程序无法区分这些值

请特别注意,函数表达式本身就是值。但不同主体的不同函数值在广义上可能仍然相等,因为它们在应用于同一参数时计算相同的结果。简单示例:

fun x => x


是两个在语法上不同但在扩展上相等的值。

鉴于
==>
是如何定义的,您对
fn x=>0
fn x=>(0+0)有何看法
?@gallais我想说它们的计算值总是相同的,所以它们在扩展上是等价的SML reduce在lambda抽象下是什么?如果我没有弄错的话,这两个函数已经是值了,它们不再减少了。但它们确实是等价的,因为它们在扩展上是相等的。
fun x => let y = x in y