gpt4 book ai didi

function - 返回 Ada 中的函数

转载 作者:行者123 更新时间:2023-12-03 06:30:07 27 4
gpt4 key购买 nike

函数是否可以返回 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 是三元函数,ycurry(x),那么我可以使用以下函数调用:y (a,b,c), y(a,b)(c), y(a)(b,c), y (a)(b)(c).

编辑

我实现了“Jacob Sparre Andersen”建议。但柯里化(Currying)看起来并不容易实现。我必须提前实现我想要使用的任何类型的所有可能变体。这是正确的吗?

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;

最佳答案

这是使用泛型的方法:

with Ada.Text_IO;

procedure Test is
-- shorthand Ada 2012 syntax; can also use full body
function Add (X, Y : Integer) return Integer is (X + Y);

generic
type A_Type (<>) is limited private;
type B_Type (<>) is limited private;
type Return_Type (<>) is limited private;
with function Orig (A : A_Type; B : B_Type) return Return_Type;
A : A_Type;
function Curry_2_to_1 (B : B_Type) return Return_Type;

function Curry_2_to_1 (B : B_Type) return Return_Type is
(Orig (A, B));

function Curried_Add is new Curry_2_to_1
(Integer, Integer, Integer, Add, 3);
begin
Ada.Text_IO.Put_Line (Integer'Image (Curried_Add (39)));
end Test;

如您所见,它非常冗长。此外,您需要为原始函数的每个 X 个参数和生成函数的每个 Y 个参数提供一个柯里化(Currying)实现,因此您将拥有很多 Curry_X_to_Y 函数。这是必要的,因为 Ada 没有可变参数泛型。

很多冗长的内容还来自于 Ada 不进行类型推断:您需要显式指定 A_TypeB_TypeReturn_Type,尽管理论上,它们可以从给定的原始函数推断出来(这就是某些函数式编程语言所做的)。

最后,您需要柯里化(Currying)函数的命名实例,因为 Ada 不支持泛型函数的匿名实例。

所以,原则上,柯里化(Currying)确实有效,但它并不像 Haskell 这样的语言那么优雅。如果您只想对特定类型进行柯里化(Currying),则代码会显着缩短,但也会失去灵活性。

关于function - 返回 Ada 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com