2009-11-01 69 views
3

這是一個家庭作業的問題:柯里和編譯器設計

解釋變換的類型在局部 參數的例程經歷的 。

到目前爲止我瞭解咖喱。但是我找不到任何資源來說明編譯器在內存中如何實現這樣的功能。我可以指出正確的方向,可能是關鍵字來搜索或鏈接到資源,或者可能在這裏解釋編譯器如何生成類型和符號表以及與問題相關的其他內容。

謝謝。

+0

在閱讀您的問題時,我立即想到了ML語言家族,它以其符號明確地回答您的問題!這將是值得您花時間玩OCaml的。 – 2009-11-01 17:40:59

回答

4

柯里是參數n的函數轉換成n一元函數:

實施例,如果有一個三元函數f :: T1(X T2)X T3 - >噸可以代表該功能作爲

f1 :: t1 -> (t2 -> (t3 -> t)) 

換句話說,f1是一個函數,它接受一個類型爲t1的參數並返回一個類型爲f2的函數。

f2 :: t2 -> (t3 -> t) 

f2是一個函數,它接受一個類型爲t2的參數並返回一個類型爲f3的函數。

f3 :: t3 -> t 

f3是一個函數,它接受t3類型的參數並返回類型t。

實施例,如果f(A,B,C)= A + B *然後C:

f3(C) == c1+c2*C where c1 and c2 are constant. 
f2(B) == f3(C) where c1 is constant and c2 is replaced with B. 
f1(A) == f2(B) where c1 is replaced with A. 

在功能的語言,函數是一等公民所以其通常具有它們作爲返回類型。

+0

+1:感謝您的具體示例! – 2010-12-17 22:12:56

+0

您是否有任何資源鏈接描述可用於將多參數函數的抽象語法樹表示轉換爲curried函數的特定算法? – 2010-12-23 04:01:31

+0

@Richard Cook,我現在唯一的來源是由Reinhard Wilhelm和Dieter Maurer撰寫的「Compiler Design」的15年樹型版本(重點介紹邏輯/功能和oo語言的前端)。如果我在假期中有時間,我可以添加一些信息。 – 2010-12-23 09:28:58

0

Currying類似於修復函數的參數。你真正需要修改的是被稱爲函數的原型..如果你有例如retn_type function(param1, param2),並且在第一個參數上對它進行修改,則將其設置爲一個固定值,然後獲得一個新函數retn_type(param2),該函數可以調用並通過不同於原來的方式。

實際上,您可以通過多種方式在編譯器中獲取它,但其簡單性的核心就是重新定義鏈接到第一個版本的新版本。因此,當您撥打retn_type(param2)時,假設參數1由curryfication指定,則執行第一個函數的相同代碼。