创建Haskell的类似物在Julia

时间:2017-01-06 04:00:47

标签: julia

我想在Julia的Haskell中创建一个Data.Either类型的模拟。以下适用于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})

1 个答案:

答案 0 :(得分:8)

似乎我忘记了使用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)

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