Here is some code https://gist.github.com/goretkin/967ca1bef0b07ee99ff8 
(pasted at end of email too)

It declares a recursive data type TreeNode that has a field children which 
is a Set of TreeNodes. The function nodes counts the number of nodes in the 
tree recursively. 
The code as shown (option 3) works well, but I am wondering if I really 
need to type-annotate the list comprehension. 

If I don't (option 2), then there is this output:

eltype of child comprehension:         TreeNode{Array{Float64,1}}
eltype of nodes(child) comprehension:     None
eltype of map(nodes,cc):         Any
ERROR: argument is empty
 in sum at reduce.jl:280
 in nodes at none:5
 in foo at none:4

because of the [favorable] resolution of issue 
6554<https://github.com/JuliaLang/julia/issues/6554>
.

In option 1, which uses map instead of a list comprehension, there is the 
following output:

eltype of child comprehension:         TreeNode{Array{Float64,1}}
eltype of nodes(child) comprehension:     Int64
eltype of map(nodes,cc):         Any
ERROR: no method zero(Type{Any})
 in sum at reduce.jl:288
 in nodes at none:11
 in foo at none:4


Which looks like a Catch-22 to me! Now the eltype of the list comprehension 
is being type-inferred correctly, exactly when we're not using it.

Gustavo



code also in gist

type TreeNode{P}
    children::Set{TreeNode{P}}
    TreeNode() = new()
end

function make_tree{P}(data::Set{P})
    tree =TreeNode{P}()
    tree.children=Set{TreeNode{P}}()
    tree
end

function nodes(tree::TreeNode) #can also do nodes{P}(tree::TreeNode{P}) 
without any difference.
    cc = [child for child in tree.children]
    println("eltype of child comprehension: \t\t$(eltype(cc))")

    listcomp = [nodes(child) for child in cc]
    println("eltype of nodes(child) comprehension: \t$(eltype(listcomp))")

    listmap = map(nodes,cc)
    println("eltype of map(nodes,cc): \t\t$(eltype(listmap))")

    #s = sum(listmap) #won't work
    #s = sum(listcomp) #won't work
    s = sum(Int64[nodes(child) for child in cc]) #does work, but only if 
you comment the above two. (type-entropy death of universe?)

    return (1+s)::Int64
end 

function foo()
    d = Set{Array{Float64,1}}()
    tree = make_tree(d)
    nodes(tree)
end

foo()

Reply via email to