Types 在Julia中,能否指定可调用函数参数的参数和返回值?

Types 在Julia中,能否指定可调用函数参数的参数和返回值?,types,julia,type-hinting,callable,Types,Julia,Type Hinting,Callable,在Python中,可以为传递给另一个函数()的可调用函数指定参数和返回值。例如: def foo( bar:Callable[[str],int],#将字符串作为参数并返回int的函数 baz:List[str]#字符串列表 )->List[int]:#返回int的列表 返回[baz中s的条形图] foo(len,[“hello”,“world!”)#将len函数应用于字符串列表 # [5, 6] 如何在Julia中编写与可调用[[str],int]等价的代码?在Julia中没有这样做的机制。

在Python中,可以为传递给另一个函数()的可调用函数指定参数和返回值。例如:

def foo(
bar:Callable[[str],int],#将字符串作为参数并返回int的函数
baz:List[str]#字符串列表
)->List[int]:#返回int的列表
返回[baz中s的条形图]
foo(len,[“hello”,“world!”)#将len函数应用于字符串列表
# [5, 6]

如何在Julia中编写与可调用[[str],int]等价的代码?

在Julia中没有这样做的机制。Julia和Python都不会静态地强制函数的类型签名。在Julia中,首选的方法是尽可能将函数参数保留为泛型,因此大多数情况下,您最好将函数以外的参数保留为泛型,如下所示:

foo(f, s) = map(f, s)
foo(f::Union{Function, Type}, s) = map(f, s)
尽管有时人们会这样注释
f
参数:

foo(f, s) = map(f, s)
foo(f::Union{Function, Type}, s) = map(f, s)
类型
包含在联合中,因为并非所有可调用对象都是
函数
的子类型,例如,请参阅手册

可以修改函数的类型,但这实际上只是尝试将返回值转换为指定的输出类型,因此,如果函数未返回已注释的类型,则可能会出现运行时转换错误

输出类型的注释通常是多余的。考虑这个代码:

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
julia>bar(42)
84
朱莉娅>42岁