3

这是一个家庭作业问题:

解释例程类型在部分参数化中所经历的转换。

到目前为止,我理解柯里化。但是我找不到任何关于编译器如何在内存中实现这​​样的函数的资源。我能否指出正确的方向,可能是要搜索的关键字或资源链接,或者可能是在此处解释编译器如何生成类型和符号表以及与问题相关的其他内容。

谢谢。

4

2 回答 2

4

柯里化是将 n 个参数函数转换为 n 个一元函数:

例如,如果您有一个三元函数 f :: t1 x t2 x t3 -> t 您可以将此函数表示为

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.

在函数式语言中,函数是一等公民,因此将它们作为返回类型很常见。

于 2009-11-01T02:21:52.900 回答
0

柯里化就像固定函数的一个参数。您真正需要修改的是被调用函数的原型。例如retn_type function(param1, param2),如果您有并且在第一个参数上对其进行了柯里化,则将其设置为固定值并获得一个retn_type(param2)可以以不同方式调用和传递的新函数从原来的。

实际上,您可以通过多种方式或技巧在编译器中获得它,但其简单性的核心只是重新定义与第一个链接的新版本。因此,当您调用时retn_type(param2),假设 parameter1 由 curryfication 指定,则执行第一个函数的相同代码。

于 2009-11-01T01:42:11.590 回答