gpt4 book ai didi

julia - 在 Julia 中创建 Haskell 的任何类型的类似物

转载 作者:行者123 更新时间:2023-12-04 07:33:35 25 4
gpt4 key购买 nike

我想创建一个 Data.Either 的类似物来自 Julia 的 Haskell 类型。以下在 v0.5 中有效:

immutable Either{T, S}
left :: Nullable{T}
right :: Nullable{S}
end

either{T, S}(::Type{T}, ::Type{S}, value::T) = Either(Nullable{T}(value), Nullable{S}())
either{T, S}(::Type{T}, ::Type{S}, value::S) = Either(Nullable{T}(), Nullable{S}(value))

a = either(Int64, String, 1)
b = either(Int64, String, "a")

println(a)
println(b)

我的问题是:是否可以使以下结构起作用:
a = Either{Int64, String}(1)
b = Either{Int64, String}("a")

(这种方式不需要额外的构造函数)。

似乎应该有足够的信息来构造对象,但到目前为止我无法说服编译器接受我尝试过的任何变体;例如写作
immutable Either{T, S}
left :: Nullable{T}
right :: Nullable{S}

Either(value::T) = Either(Nullable{T}(value), Nullable{S}())
Either(value::S) = Either(Nullable{T}(), Nullable{S}(value))
end

结果是
ERROR: LoadError: MethodError: no method matching Either{T,S}(::Nullable{Int64}, ::Nullable{String})

最佳答案

好像忘记了默认构造函数是用 new 调用的.此变体有效:

immutable Either{T, S}
left :: Nullable{T}
right :: Nullable{S}

Either(value::T) = new(Nullable{T}(value), Nullable{S}())
Either(value::S) = new(Nullable{T}(), Nullable{S}(value))
end

a = Either{Int64, String}(1)
b = Either{Int64, String}("a")

println(a)
println(b)

另外,由于未公开默认构造函数,您无法创建具有两个非空值的对象,因此会自动强制执行不变量。

关于julia - 在 Julia 中创建 Haskell 的任何类型的类似物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498728/

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