Yup. Maybe another way to say it: the function system can do so much ad hoc 
specialization precisely because the type system provides enough invariants for 
the compiler to depend upon.

  -- John

On Oct 22, 2014, at 9:37 AM, Stefan Karpinski <ste...@karpinski.org> wrote:

> Right, the question is essentially whether you can implicitly introduce type 
> parameters for the programmer – which you can for immutable types but not for 
> mutable types. This example may make the difference clearer:
> 
> type Foo1
>   field::Number
> end
> 
> type Foo2{T<:Number}
>   field::T
> end
> 
> These types are pretty similar, but there's an important behavioral 
> difference:
> 
> julia> foo1 = Foo1(123)
> Foo1(123)
> 
> julia> foo2 = Foo2(123)
> Foo2{Int64}(123)
> 
> julia> foo1.field = 1.23
> 1.23
> 
> julia> foo1
> Foo1(1.23)
> 
> julia> foo2.field = 1.23
> ERROR: InexactError()
>  in convert at int.jl:185
> 
> Since the type of `.field` is encoded in the type of Foo2, you can change the 
> value of `.field` but not it's type. For Foo1, you can change the value and 
> the type of `.field.` Thus, if you have code that's specialized for a 
> particular kind of Foo2, it is specialized for the type of `.field` as well – 
> and in particular, that type cannot change over the course of the function. 
> If you've got code that's specialized for Foo1, you don't know anything about 
> the type of `.field` and moreover that type can change through the course of 
> a single function body. For immutables, of course, the value of a field can't 
> change, nevermind its type, so you could implicitly make the type of any 
> field part of the type.
> 
> On Wed, Oct 22, 2014 at 12:30 PM, John Myles White <johnmyleswh...@gmail.com> 
> wrote:
> The clean way to get that effect is via parametric types.
> 
>  -- John
> 
> On Oct 22, 2014, at 9:08 AM, Cedric St-Jean <cedric.stjean...@gmail.com> 
> wrote:
> 
>> Somewhat OT: since the JIT compiles a different function for each argument 
>> type combination, couldn't it compile a different type object for every 
>> field type combination?
>> 
>> On Wednesday, October 22, 2014 10:53:26 AM UTC-4, Iain Dunning wrote:
>> Do you feel like you are over-typing things?
>> 
>> In function definitions, you only need types if you actually need to them to 
>> pick a function to dispatch to. They don't make anything go faster, as a 
>> specific version of a function will be compiled for every different set of 
>> argument types you try calling it with.
>> 
>> So, check out:
>> https://github.com/IainNZ/GraphLayout.jl/blob/master/src/spring.jl
>> for example.
>> layout_spring_adj{T}(adj_matrix::Array{T,2}
>> So it takes any array of element type T. For every time you call this with a 
>> different element type, a different version of the function will be 
>> compiled. So this fancy looking code:
>> if adj_matrix[i,j] != zero(eltype(adj_matrix))
>> Simply gets turned into if adj_matrix[i,j] != 0.0  or  0 or False or .... 
>> and so on, pretty magic!
>> 
>> For Types, you should specify concrete types whenever you can, or use 
>> parametric types if you can't. If you don't, and use say, Number, or leave 
>> it blank, simple things like Float64s and Ints will be "boxed", so there 
>> will be overhead whenever you use them and the compiler may struggle to 
>> infer that some things are Float64s or Ints and not just Anys.
>> 
>> Hope that helps somewhat.
>> 
>> On Wednesday, October 22, 2014 7:28:12 AM UTC-4, Nils Gudat wrote:
>> Hi Andreas,
>> 
>> Don't know if you've seen this already and whether this is helpful at all, 
>> but I discovered this site once when I got confused by some TypeErrors, it 
>> basically lays out the entire type tree of Julia.
>> 
>> Best,
>> Nils
>> 
>> On Wednesday, October 22, 2014 12:11:03 PM UTC+1, Andreas Lobinger wrote:
>> Hello,
>> 
>> i'm now a julia user for some time, but still i have problems (comming from 
>> a c, f77, matlab, python background) to understand the type system. 
>> Especially when i try to integrate own code into packages (happened to Cairo 
>> + Compose, pending for Winston) i seem to choose always a more complicated 
>> way (my observation, code similar in py or c just looks shorter...) because 
>> somehow things do not match. 
>> 
>> So.
>> 
>> What to read to understand the julia approach to types and type interference?
>> 
>> Wishing a happy day,
>>        Andreas
>> 
>> 
> 
> 

Reply via email to