簡體   English   中英

最外部的評估策略如何評估功能的部分應用和咖喱函數的應用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM