Function 声明一个Julia函数,该函数返回具有特定签名的函数

Function 声明一个Julia函数,该函数返回具有特定签名的函数,function,types,julia,Function,Types,Julia,如何声明一个Julia函数,该函数返回一个具有特定签名的函数。例如,假设我想返回一个函数,该函数接受一个Int并返回一个Int: function buildfunc()::????? mult(x::Int) = x * 2 return mult end 问号应替换为什么?为此,您可以使用函数类型。来自Julia文档: 函数是所有函数的抽象类型 其中打印: julia> println(a()(2)); 四, Julia将为Float64输入引发异常 julia&

如何声明一个Julia函数,该函数返回一个具有特定签名的函数。例如,假设我想返回一个函数,该函数接受一个Int并返回一个Int:

function buildfunc()::?????
   mult(x::Int) = x * 2
   return mult
end

问号应替换为什么?

为此,您可以使用
函数
类型。来自Julia文档:

函数是所有函数的抽象类型

其中打印:

julia> println(a()(2));
四,

Julia将为Float64输入引发异常

   julia> println(a()(2.0)); 
错误:MethodError:没有与b(::Float64)匹配的方法
最近的候选对象是:b(::Int64)


有一件事需要澄清。 在返回的参数上添加类型声明只是一个断言,而不是函数定义的一部分。要了解正在发生的事情,请查看函数的代码(这是预编译阶段):

julia> f(a::Int)::Int = 2a
f (generic function with 1 method)

julia> @code_lowered f(5)
CodeInfo(
1 ─ %1 = Main.Int
│   %2 = 2 * a
│   %3 = Base.convert(%1, %2)
│   %4 = Core.typeassert(%3, %1)
└──      return %4
)
在这种情况下,由于返回的类型很明显,因此在编译过程中,此断言将被实际删除(请尝试
@code\u native f(5)
查看您自己)

如果出于某种原因需要生成函数,我建议使用
@generated
宏。注意:元编程对于解决任何与Julia相关的问题来说都是一种过度的手段

@generated function f2(x)
    if x <: Int
        quote
            2x
        end
    else
        quote
            10x
        end
    end
end
请注意,此函数生成实际上是在编译时进行的:

julia> @code_lowered f2(2)
CodeInfo(
    @ REPL[34]:1 within `f2'
   ┌ @ REPL[34]:4 within `macro expansion'
1 ─│ %1 = 2 * x
└──│      return %1
   └
)

希望这能解决问题。

很公平,您如何指定返回的函数接受int并返回int?据我所知,这是不可能的。有一种抽象类型“函数”,每个函数都是它的一个具体子类型。没有具有指定参数类型的中间类型(顺便说一句,这只适用于Julia中的方法,而不是函数)。谢谢您的回答。其他语言(如C)允许声明函数返回的函数的签名,我认为这是有正当理由的。即使只是为了断言(我想可能还有其他好的理由),为什么不呢?Julia没有语法来精确声明函数方法返回的方法的签名。有关更多想法,请参阅讨论。谢谢您的回答。其他语言(如C)允许声明函数返回的函数的签名,我认为这是有正当理由的。即使只是为了断言(我想可能还有其他好的理由),为什么不呢?因为在99%的情况下,您返回的是函数,而不是方法对象。在多分派语言中为函数指定类型非常困难。但请参见,例如,此问题:。
julia> f2(3)
6

julia> f2(3.)
30.0
julia> @code_lowered f2(2)
CodeInfo(
    @ REPL[34]:1 within `f2'
   ┌ @ REPL[34]:4 within `macro expansion'
1 ─│ %1 = 2 * x
└──│      return %1
   └
)