Functional programming 函数式编程:值的等价性和求值
我正在读一些关于SML的笔记,对作者的一句话感到有点困惑。让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'
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