【发布时间】:2017-08-21 20:25:54
【问题描述】:
有没有可能,一个函数可以在 Ada 中返回一个函数?我正在努力让currying 工作。
type Integer_Func_Type is access function (Y : Integer) return Integer;
function Add (X : Integer) return Integer_Func_Type is
function Inner (Y : Integer) return Integer is
begin
return X + Y;
end Inner;
begin
return Inner'Access;
end;
最后,我不想一次提供一个函数的所有参数。例如:如果x是三元函数,y是curry(x),那么我可以使用以下函数调用:y(a,b,c)、y(a,b)(c)、y(a)(b,c)、y(a)(b)(c)。
编辑
我实施了“Jacob Sparre Andersen”的建议。但看起来柯里化并不容易实现。我必须提前实现我想使用的任何类型的所有可能变体。这是正确的吗?
with Ada.Text_IO;
with R;
procedure Hello is
Add_Two : R.Test2 := (X => 2);
begin
Ada.Text_IO.Put_Line(Add_Two.Add(3)'Img);
end Hello;
r.adb
package body R is
function Add(A : Test2; Y : Integer) return Integer is
begin
return A.X + Y;
end Add;
end R;
r.ads
package R is
type Test is abstract tagged null record;
function Add(A : Test; Y : Integer) return Integer is abstract;
type Test2 is new Test with
record
X : Integer;
end record;
overriding
function Add(A : Test2; Y : Integer) return Integer;
end R;
【问题讨论】:
-
我认为内部函数的访问规则/范围会有问题。
-
@DaleStanbrough 我明白了。你认为,currying 是可能的吗?
-
Ada 不进行类型推断,所以是的,您必须将所需的每种函数(参数和返回类型)声明为单独的标记类型。
-
Chris Okasaki 在Functional Programming in ...Ada? 中解决了这个问题。
-
不,简而言之,您不能真正将函数绑定到仅存在于本地的环境(LISP 意义上),因此返回函数并且这种环境不是可能在艾达。但是,一些(如果不是大多数)编译器会通过提供非 Ada 属性
'Unrestricted_Access让您承担风险。所以,如果你能延长这个函数(指针)所引用的对象的生命周期超出语言的要求......