【问题标题】:Call a Function with parametric type while specifying the Type (Julia 0.5)在指定类型时调用具有参数类型的函数(Julia 0.5)
【发布时间】:2017-04-23 03:59:08
【问题描述】:

(我指的是 Julia 0.5) 假设我定义了一个函数:

f{T<:Real}(x::T=one(T), y::T=one(T)) = x+y 我想在指定类型时调用它,但不通过参数指定它。例如。我想要做: f{Float64}() 在控制台中,这给出了错误: ERROR: TypeError: Type{...} expression: expected Type{T}, got #f 那么,是否可以使用{} 语法在函数调用期间调用任何函数(参数类型的构造函数除外)?

编辑:我想出这个问题的原因是因为我想使用默认参数,但同时还要指定类型,比如f{BigFloat}()

【问题讨论】:

    标签: function types julia function-call


    【解决方案1】:

    乔治,

    当您调用参数化函数时,参数“拾取”的值取决于您在函数调用中放置的参数 value[s] 的类型 [s]。信息流是从给定参数到符号类型参数。所以你不应该尝试打电话给f{AbstractFloat}(some_kind_of_number)。在那种情况下,some_kind_of_number 可能是例如Float64,并且对应;但它可能是例如int64,然后你就有冲突了。

    如果您想强制数字变量采用特定的数值类型,正确的方法是直接转换它或为这种情况定义转换(如果它不存在的话)。如果你想捕获这种不匹配,那么正确的方法是传入你想要指定的类型以及数值变量:

    # below
    # x is of type Real or of any subtype of Real
    # T is Real or any type that is a subtype of Real
    # so T may or may not equal typeof(x)
    
    function f{T<:Real}(::Type{T}, x::Real)  
        y = convert(T, x)
        return g(y)
    end
    
    function f{T<:Real}(::Type{T}, x::Real)
        if typeof(x) == T
           #...
        else
           throw(ErrorException("msg"))
        end
    end
    

    如果您想完成其他事情,请告诉我具体情况。

    【讨论】:

    • 感谢您的回复,但我非常了解convert 函数和一般类型的稳定性,您的答案不是我想要的。我正在寻找一种将类型信息传递给函数的方法,除了一些类型信息之外,不给它任何实际参数。 Fabio 对我的问题的第二个回答正是我想要的。
    【解决方案2】:

    如果您不介意写 f(BigFloat) 而不是 f{BigFloat}(),您可以将函数定义更改为:

    f{T}(args::T...) = f(T, args...)
    f{T<:Real}(::Type{T}, x::T=one(T), y::T=one(T)) = x+y
    

    这允许您在必要时指定类型,同时仍允许您编写f(1,2)

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 2023-03-09
      • 2020-04-12
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多