I think this is fine and idiomatic
julia> type A{B}
x::Float64
function A(x)
B::Bool # asserts that B is indeed a Bool
new(x)
end
end
julia> A(x, b::Bool) = A{b}(x)
A{B}
julia> A(5, true)
A{true}(5.0)
julia> function dothing(a::A{true})
println("do thing with true")
end
dothing (generic function with 1 method)
julia> function dothing(a::A{false})
println("do thing with false")
end
dothing (generic function with 2 methods)
julia> dothing(A(5,true))
do thing with true
julia> dothing(A(5,false))
do thing with false
On Thu, 2016-03-31 at 04:51, Chris <[email protected]> wrote:
> Here's my current dilemma, (hopefully) explained by this simple example:
>
> I have a composite type that has a bool field:
>
> type A
> x::Float64
> b::Bool
> end
>
> I have a function with different behavior based on the value of A.b. The
> manual <http://docs.julialang.org/en/release-0.4/manual/types/#value-types>
> suggests
> the following solution:
>
> function dothing(a::A, ::Type{Val{false}})
> ...
> end
>
> function dothing(a::A, ::Type{Val{true}})
> ...
> end
>
> That's fine, but now I have to call the function as dothing(a, Val{a.b}),
> which just strikes me as slightly redundant/verbose. Is there some way to
> make this more compact, i.e. just dothing(a), while still avoiding the
> check of a.b inside the function? Perhaps parameterizing the type A itself?
>
> Hopefully I made myself relatively clear. Thanks in advance.