我正在閱讀關於SML的一些註釋,並且對作者的評論有點困惑。讓e ==> v
指示評價值和e ~ e'
表明e
是外延上等價於e'
函數式編程:等價性和價值評估
作者寫道:
如果
e ~ e'
(包括t
型),並有t
類型的SML價值v
STe ~ v
,則存在SML值v'
(同樣是t
),s.t.e' ==> v'
和v ~ v'
。確保您注意到(和理解我們爲什麼不在這裏說,如果
e ~ e'
和e ~ v
然後e' ==> v
。
爲什麼不呢?
我正在閱讀關於SML的一些註釋,並且對作者的評論有點困惑。讓e ==> v
指示評價值和e ~ e'
表明e
是外延上等價於e'
函數式編程:等價性和價值評估
作者寫道:
如果
e ~ e'
(包括t
型),並有t
類型的SML價值v
STe ~ v
,則存在SML值v'
(同樣是t
),s.t.e' ==> v'
和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
和
fun x => let y = x in y
兩個值是語法上不同但外延上相等。
鑑於如何定義'==>',您可以說'fn x => 0'與'fn x =>(0 + 0)'有什麼關係? – gallais
@gallais我會說他們總是評估相同的價值,所以他們是延伸等值 – bclayman
SML是否減少在lambda抽象下?如果我沒有弄錯,這兩個函數已經是*值*,並且它們不再減少。但是它們確實是等價的,因爲它們是相等的。 – gallais