在 Julia 中,您可以指定可调用函数参数的参数和 return 值吗?
In Julia, can you specify the parameters and return value of a callable function argument?
在 Python 中,您可以为传递给另一个函数 (reference) 的可调用对象指定参数和 return 值。例如:
def foo(
bar: Callable[[str],int], # a function that takes a string as an argument and returns an int
baz: List[str] # a list of strings
) -> List[int]: # returns a list of ints
return [bar(s) for s in baz]
foo(len,["hello","world!"]) # apply the len function to the list of strings
# [5, 6]
如何在 Julia 中编写与 Callable[[str],int]
等效的内容?
Julia 中没有这样做的机制。 Julia 和 Python 都没有静态地强制执行函数的类型签名。在 Julia 中,首选是让你的函数参数尽可能通用,所以大多数时候你最好让除函数之外的参数通用,就像这样:
foo(f, s) = map(f, s)
尽管有时人们会这样注释 f
参数:
foo(f::Union{Function, Type}, s) = map(f, s)
Type
包含在联合中,因为并非所有可调用对象都是 Function
的子类型,例如看看手册中的Function-like objects。
可以 annotate the output type 一个函数,但这实际上是尝试将 return 值转换为指定的输出类型,因此如果您的函数不 return 您为其注释的类型。
输出类型的注释通常是多余的。考虑这段代码:
bar(x::Int)::Int = 2x
如果我们查看降低的代码,我们可以看到已添加到代码中的额外类型转换:
julia> @code_lowered bar(42)
CodeInfo(
1 ─ %1 = Main.Int
│ %2 = 2 * x
│ %3 = Base.convert(%1, %2)
│ %4 = Core.typeassert(%3, %1)
└── return %4
)
然而,在这种情况下,编译器足够聪明,可以判断出当输入是整数时,输出将是整数,不需要转换:
julia> @code_llvm bar(42)
; @ REPL[1]:1 within `bar'
define i64 @julia_bar_788(i64) {
top:
; ┌ @ int.jl:87 within `*'
%1 = shl i64 %0, 1
; └
ret i64 %1
}
其实我们看到bar
已经简化为左移位操作
julia> bar(42)
84
julia> 42 << 1
84
在 Python 中,您可以为传递给另一个函数 (reference) 的可调用对象指定参数和 return 值。例如:
def foo(
bar: Callable[[str],int], # a function that takes a string as an argument and returns an int
baz: List[str] # a list of strings
) -> List[int]: # returns a list of ints
return [bar(s) for s in baz]
foo(len,["hello","world!"]) # apply the len function to the list of strings
# [5, 6]
如何在 Julia 中编写与 Callable[[str],int]
等效的内容?
Julia 中没有这样做的机制。 Julia 和 Python 都没有静态地强制执行函数的类型签名。在 Julia 中,首选是让你的函数参数尽可能通用,所以大多数时候你最好让除函数之外的参数通用,就像这样:
foo(f, s) = map(f, s)
尽管有时人们会这样注释 f
参数:
foo(f::Union{Function, Type}, s) = map(f, s)
Type
包含在联合中,因为并非所有可调用对象都是 Function
的子类型,例如看看手册中的Function-like objects。
可以 annotate the output type 一个函数,但这实际上是尝试将 return 值转换为指定的输出类型,因此如果您的函数不 return 您为其注释的类型。
输出类型的注释通常是多余的。考虑这段代码:
bar(x::Int)::Int = 2x
如果我们查看降低的代码,我们可以看到已添加到代码中的额外类型转换:
julia> @code_lowered bar(42)
CodeInfo(
1 ─ %1 = Main.Int
│ %2 = 2 * x
│ %3 = Base.convert(%1, %2)
│ %4 = Core.typeassert(%3, %1)
└── return %4
)
然而,在这种情况下,编译器足够聪明,可以判断出当输入是整数时,输出将是整数,不需要转换:
julia> @code_llvm bar(42)
; @ REPL[1]:1 within `bar'
define i64 @julia_bar_788(i64) {
top:
; ┌ @ int.jl:87 within `*'
%1 = shl i64 %0, 1
; └
ret i64 %1
}
其实我们看到bar
已经简化为左移位操作
julia> bar(42)
84
julia> 42 << 1
84