types - 如何在 Julia 实例化期间更改参数类型

标签 types julia parameterized-constructor

我正在尝试执行以下操作

type Foo{T}
  x::changeType(T)
end

函数 changeType 将类型参数更改为其他类型。它不一定是一个函数,我很乐意使用字典或宏或 w/e,我只需要一种方法来做到这一点。

我用函数和字典都尝试过,但都导致了错误。

最佳答案

我认为这不是完全可能的。但是,您可以尝试一些解决方法。

  1. 不要限制 x 的类型,只需手动将 x 实例化为正确的类型即可:

    type Foo{T}
        x
        y::T
    end
    
    >>> f = Foo{Int32}(5.0f0, 2)
    Foo{Int32}(5.0f0,2)
    >>> typeof(f.x), typeof(f.y)
    (Float32, Int32)
    
  2. 您可以将您的对象包装在一个函数中:

    const types = Dict(Int64 => Float32)
    
    type Foo{T}
        x::T
    end
    
    foo(k) = Foo{get(types, T, T)}
    

    然后创建一个Foo的对象

    >>> foo(Int64)
    Foo{Float32}
    
  3. 如果您希望在同一type 中有混合类型的字段(例如Tmap(T) 的字段)您可以稍微修改一下构造函数:

    const types = Dict(Int64 => Float32)
    
    type Foo{T}
        x
        y::T
    
        Foo(x=0, y=0) = new(get(types, T, T)(x), y)
    end
    

    这将允许您在将 x 映射到 Float32 时将 Foo 创建为 Foo{Int64}:

    >>> Foo{Int64}(5, 2)
    Foo{Int64}(5.0f0, 2)     # x is Float32, y is Int64
    
  4. 最后一个,可能也是最可行的一个:首先定义字典并将您的 type 包装在两个 types 中:

    const types = Dict(Int64 => Float32)
    
    type Foo{T, V}
        x::V
        y::T
    end
    

    现在将 Foo 对象的构造包装到一个函数中:

    foo(T) = Foo{T, get(types, T, T)}
    foo(T, args...) = Foo{T, get(types, T, T)}(args...)
    

    foo 函数创建类型为 Foo 的对象,其中第一个参数指定 Foo 的类型 TV 类型是从 types 字典中动态推断出来的。

    >>> foo(Int64)
    Foo{Int64,Float32}
    >>> foo(Int64, 5, 2)
    Foo{Int64,Float32}(5.0f0,2) # x is Float32, y is Int64
    

注意:在上述两种方法中,如果types字典中没有定义T,则get函数返回T 因此 x 被映射到 T。是不需要映射的类型的回退方法。例如。对于第三个选项:

>>> Foo{Int32}(5, 2)
Foo{Int32}(5,2)

xy 都是 Int32 因为 Int32 不在映射字典 types。对于第四个选项:

>>> foo(Int32)
Foo{Int32,Int32}

我认为目前 x 的类型不能在编译时指定为 T 的函数,但上述解决方法应该可以完成这项工作。

我也不知道 Julia 编译器有多聪明..鉴于 types 字典是常量,它可能会做一些聪明的事情并推断出 x 从那里(也许开发人员可以回答这个问题或提供进一步的改进)。

关于types - 如何在 Julia 实例化期间更改参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36639887/

相关文章:

c++ - 为什么重建后的 map 类型与原始 map 类型不同?

arrays - Julia 缺少数组构造函数?

python - 是否可以从 Julia 调用 Python 函数并返回其结果?

c# - 在c#中使用接口(interface)实例化类

java - 实例化参数化类

Java Optional.orElseThrow 签名解释

具有不同类型键的 Haskell 映射

c - 数据类型存储

types - OCaml 中的参数化类型

csv - 下载 CSV 问题 Julia - ArgumentError : Symbol name may not contain\0