types - 在 Julia 中,您可以指定可调用函数参数的参数和返回值吗?

标签 types julia type-hinting callable

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

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函数的返回值,但这实际上只是尝试将返回值转换为指定的输出类型,因此如果您的函数没有返回您为其注释的类型,您可能会收到运行时转换错误。

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

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

关于types - 在 Julia 中,您可以指定可调用函数参数的参数和返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66860149/

相关文章:

python - 从 pd.DataFrame 设置 dtypes 给出 TypeError : object of type 'type' has no len()

java - MatLab 能理解 Java int 数据类型吗?

julia - 在 Julia 中读写 RData 文件

Python 静态类型提示/检查 Iterable[AnyStr] 与 Iterable[str] 之间的不匹配 |可迭代[字节]

typescript - 类类型作为 TypeScript 中的参数

Python 3.10+ : Optional[Type] or Type | None

compiler-construction - 如何推断强制?

c - 指针分配二维数组指针的警告消息

performance - 使用计数器是一种好习惯吗?

types - 为什么我的类型构造函数没有被识别