gpt4 book ai didi

julia - 是否可以在未评估的上下文中获取 Julia 函数的返回类型?

转载 作者:行者123 更新时间:2023-12-04 14:21:58 24 4
gpt4 key购买 nike

我想在不评估函数的情况下获取 Julia 中函数调用的结果类型,并使用该类型。所需的用法看起来有点像这样:

foo(x::Int32) = x
foo(x::Float32) = x

y = 0.0f0
# Assert that y has the type of result of foo(Float32)
y::@resultof foo(Float32) # This apparently does not work in Julia

而在上述情况下,我可以简单地使用 y::typeof(foo(1.0f0))对于虚拟变量的评估,在更复杂的情况下,初始化虚拟变量可能既不方便又昂贵。比如我想使用函数 eachline(filename::AbstractString; keep::Bool=false)返回的迭代器类型,但使用 typeof确实需要成功打开文件,这看起来有点矫枉过正。

从 C++ 背景来看,我要问的是是否有等效的 std::result_of在 Julia 。问题跟 this one差不多但语言是 Julia 。

经过一些研究,我发现 Julia 允许在一个函数中返回不同类型的值,其中类型推断看起来非常困难。例如,
foo(x::Int64) = x == 1 ? 1 : 1.0

返回类型现在可以是 Int64Float64 ,取决于输入值。尽管如此,在这种情况下,我仍然想知道是否有一些宏技巧可以推断返回类型是 Union{ Int64, Float64 } ?

总而言之,我的问题是:
  • 从根本上说,是否可以通过仅在 Julia 中提供参数类型来获取函数返回类型?
  • 如果 1 是不可能的,对于具有一个确定性返回类型的函数(如第一个示例中),是否有可能获得未评估的返回类型?
  • (可能与我想要的无关,但我认为它可以促进我的理解)编译 Julia 代码时,函数的返回类型是否已知?还是类型信息仅在运行时确定?
  • 最佳答案

    1) 是的,Base.return_types(foo, (Int64,))将返回一个包含您要求的返回类型的数组,即 Union{ Int64, Float64 }在这种情况下。如果删除第二个参数,即指定输入参数类型的元组,您将获得所有可能的推断返回类型。

    然而,应该注意的是,编译器可能在任何时候决定返回 Any。或任何其他正确但不精确的返回类型。

    2) 见 1) ?

    3) 对于给定的输入参数类型,编译器尝试在编译时推断返回类型。如果有多个可能,它将推断出 Union类型。如果完全失败,或者返回类型太多,会推断Any作为返回类型。在后一种情况下,实际的返回类型仅在运行时才知道。

    1)的示范:

    julia> foo(x::Float32) = x
    foo (generic function with 1 methods)

    julia> foo(x::Int32) = x
    foo (generic function with 2 methods)

    julia> foo(x::Int64) = x == 1 ? 1 : 1.0
    foo (generic function with 3 methods)

    julia> Base.return_types(foo)
    3-element Array{Any,1}:
    Union{Float64, Int64}
    Int32
    Float32

    julia> Base.return_types(foo, (Int64,))
    1-element Array{Any,1}:
    Union{Float64, Int64}

    julia> Base.return_types(foo, (Int32,))
    1-element Array{Any,1}:
    Int32

    关于julia - 是否可以在未评估的上下文中获取 Julia 函数的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58328476/

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