2009-11-01 43 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指定,则执行第一个函数的相同代码。