Le mardi 10 mars 2015 14:21:00 UTC+1, Mauro a écrit :
>
> > abstract typeA
> >
> > immutable typeA1 <: typeA end
> > immutable typeA2 <: typeA end
> >
> > type typeB1 end
> > type typeB2 end
>
> More Julian would be to write:
>
> transformType(T::Type{typeA1}) = typeB1
> transformType(T::Type{typeA2}) = typeB2
> transformType(T::Type) = error("Cannot handle type $T")
>
ok, thanks
>
> > function transformType(T)
> > if T == typeA1
> > return typeB1
> > elseif T == typeA2
> > return typeB2
> > end
> > error("Cannot handle type $T")
> > end
> >
> > function compute{T<:typeA}(a::transformType(T), b::transformType(T))
> > return (a, b)
> > end
> >
> > but it failed with the following error message
> >
> > ERROR: Cannot handle type T<:typeA
> > in error at error.jl:21
> > in transformType at /Users/bpiwowar/Desktop/test.jl:15
> > in include at
> >
> /opt/homebrew-cask/Caskroom/julia/0.3.5/Julia-0.3.5.app/Contents/Resources/julia/lib/julia/sys.dylib
>
>
> > in include_from_node1 at loading.jl:128
> > in process_options at
> >
> /opt/homebrew-cask/Caskroom/julia/0.3.5/Julia-0.3.5.app/Contents/Resources/julia/lib/julia/sys.dylib
>
>
> > in _start at
> >
> /opt/homebrew-cask/Caskroom/julia/0.3.5/Julia-0.3.5.app/Contents/Resources/julia/lib/julia/sys.dylib
>
>
> > while loading /Users/bpiwowar/Desktop/test.jl, in expression starting on
> > line 18
> >
> > The type transformType(T)is hence computed when the method is defined,
> but
> > not when the method is called. Is there any way to prevent this (to
> defer
> > evaluation at compilation time?).
>
> Have a look at stagedfunction (v0.4).
>
I tried with the nightly build, but without success (using stagedfunction
instead of function) - however, it looks like it is the solution, maybe I
will just have to wait until this is implemented (and the syntax set).
>
> > The only other way (I can think of) to get this result would be to use
> > macros and enumerate the different possible types, but if somebody can
> > think of a better solution, thanks!
>
> why not write:
> type typeB1 <: typeB end
> type typeB2 <: typeB end
> compute(a::typeB, b::typeB) = return (a, b)
>
Because I would like to ensure that a and b are of the same type