I am having similar issues.   Using a recursive function in an Array 
comprehension...

groupBy=[x->get_ancestor_self(msr.dhaEdges[msr.cubeDef.hiers[x]][x], 
drillByMatched[x])::DimHierAttr for x in i]
println ("xxxxx: $(typeof(groupBy))")  --> #Array of Function
    
even if I type the array ..it will not work

groupBy=DimHierAttr[x->get_ancestor_self(msr.dhaEdges[msr.cubeDef.hiers[x]][
x], drillByMatched[x])::DimHierAttr for x in i]

here is recursive function

function get_self_if_ancestor(dha::DimHierAttr, dh::DimHier) 
    if dha.dimHier == dh
        return dha
    elseif dha.parentDimHierAttr == nothing 
        return nothing
    elseif get_ancestor_self(dha.parentDimHierAttr, dh) == nothing
        return dha
    else
        return nothing
    end  
end


Any ideas on how to get it typed as Array{DimHierAttr,1}???


On Sunday, May 11, 2014 at 3:15:48 PM UTC-4, Gustavo Goretkin wrote:
>
> 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