我想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)
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否可以使以下结构工作:
a = Either{Int64, String}(1)
b = Either{Int64, String}("a")
Run Code Online (Sandbox Code Playgroud)
(这种方式不需要额外的构造函数).
似乎应该有足够的信息来构造对象,但到目前为止,我无法说服编译器接受我尝试的任何变体; 例如写作
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
Run Code Online (Sandbox Code Playgroud)
结果是
ERROR: LoadError: MethodError: no method matching Either{T,S}(::Nullable{Int64}, ::Nullable{String})
Run Code Online (Sandbox Code Playgroud)
似乎我忘了调用默认构造函数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)
Run Code Online (Sandbox Code Playgroud)
另外,由于未公开默认构造函数,因此无法创建具有两个非空值的对象,因此将自动强制执行不变量.
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |