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 

Reply via email to