[英]How does the outermost evaluation strategy evaluate partial application of a function and application of a curried function
赫頓在Haskell編程說
計算表達式時,應以什么順序執行歸約? 一種通用策略(稱為最內層評估 )是始終選擇最內層的Redex,因為它不包含其他Redex。 如果最里面的redex不止一個,按照慣例,我們選擇一個從表達式最左邊的位置開始的redex。
對表達式進行評估的另一種常見策略是對最內層的評估,它總是選擇最外層的Redex,因為它不包含在其他Redex中。 如果有多個這樣的redex,則像以前一樣,我們選擇從最左邊開始的那個。 毫不奇怪,這種評估策略被稱為最外部評估 。
在部分應用函數時,例如mult(3)(4)
,其中mult
定義為
mult :: (Int,Int) -> Int
mult (x,y) = x * y
最里面的評估將首先將mult(3)
評估為\\y->3*y
,然后評估(\\y->3*y)4
。 最外部的評估將如何評估mult(3)(4)
?
在應用咖喱函數時,例如mult'(3)(4)
,其中
mult' :: Int -> Int -> Int
mult' x = \y -> x * y
最里面的評估將首先將mult'(3)
評估為\\y->3*y
,然后評估(\\y->3*y)4
。 最mult'(3)(4)
評估將如何評估mult'(3)(4)
?
唯一明智的解釋方式是:
mult :: (Int, Int) -> Int
mult (x,y) = x * y
在較大問題的上下文中,它是一個采用元組類型的單個參數(Int, Int)
的一元函數。 因此,不能部分應用mult
。 特別是, mult(3)
沒有任何意義,因為3
不是類型(Int, Int)
的元組。
結果,無論您使用最外層還原還是最內層還原,按照Hutton的意義對表達式mult (3,4)
的還原都是相同的。 這里只有一個redex / application,將mult
應用於(3,4)
,最外層和最內層的減少都會得到減少:
mult (3,4)
=> 3 * 4
=> 12
對於功能:
mult' :: Int -> Int -> Int
mult' x y = x * y
或等效地:
mult' = \x -> (\y -> x * y)
表達式mult' 3 4
或等效地(mult' 3) 4
經歷了最深層的歸約,如:
(mult' 3) 4
= ((\x -> (\y -> x * y)) 3) 4
=> (\y -> 3 * y) 4
=> 3 * 4
=> 12
奇怪的是,最外面的減少以完全相同的方式進行:
(mult' 3) 4
= ((\x -> (\y -> x * y)) 3) 4 -- (1)
=> (\y -> 3 * y) 4
=> 3 * 4
=> 12
這是因為((\\x -> \\y -> x * y) 3)
在第(1)行中的應用為4
,盡管它是最外面的應用程序 ,但它不是redex。 它不能減少,因為要應用的東西((\\x -> \\y -> x * y) 3)
不是lambda表達式。 (這是一個lambda表達式應用於參數的方法。)
因此,與首次出現相反,第(1)行中只有一個redex,並且最內部和最外部的歸約策略選擇相同的redex。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.