I know that haskell does this with constants that are polymorphic
functions, but I don't know how it works.

James Fairbanks
PhD Student
Georgia Tech

On Mon, Mar 23, 2015 at 11:26 AM, Seth <[email protected]> wrote:

> Opening a can of worms, here, perhaps, but is there any way to have
> constants assume whatever datatype is reasonable so that converts like this
> aren't necessary?
>
>
>
> On Saturday, March 21, 2015 at 9:07:21 PM UTC-7, James Fairbanks wrote:
>>
>> Glad to help. There is also a function Base.one(T) which is defined to
>> give the multiplicative identity of T which for all subtypes of Real should
>> be the same as convert(T, 1). You aren't really using it as the
>> multiplicative identity though so I am not sure which is better.
>>
>> On Sat, Mar 21, 2015, 11:55 AM Seth <[email protected]> wrote:
>>
>>> Thanks for pointing me in the right direction. I fixed it. It turns out
>>> that when I set the unitrange (using 1:n), the "1" was being interpreted as
>>> Int64, which caused the UnitRange to be Int64, which messed things up. I
>>> now do a convert(T,1) in the construction and everything's good:
>>>
>>> julia> Graph(Int16(5))
>>> {5, 0} undirected graph
>>>
>>>
>>> On Saturday, March 21, 2015 at 8:37:55 AM UTC-7, Seth wrote:
>>>>
>>>> James,
>>>>
>>>> Thanks. Here's what I get:
>>>>
>>>> julia> Graph(Int16(5))
>>>> ERROR: MethodError: `convert` has no method matching convert(::Type{
>>>> UnitRange{Int16}}, ::UnitRange{Int64})
>>>> This may have arisen from a call to the constructor UnitRange{Int16
>>>> }(...),
>>>> since type constructors fall back to convert methods.
>>>> Closest candidates are:
>>>>   convert{T}(::Type{T}, ::T)
>>>>
>>>>
>>>>
>>>> On Thursday, March 19, 2015 at 2:17:17 PM UTC-7, James Fairbanks wrote:
>>>>>
>>>>> You left out the initialization code for the fields in your excerpt
>>>>> above. What happens when you call Graph(Int16(5))?
>>>>>
>>>>> On Friday, March 6, 2015 at 2:42:20 PM UTC-5, Seth wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> I have
>>>>>>
>>>>>> abstract AbstractGraph{T<:Integer}
>>>>>>
>>>>>> type Graph{T}<:AbstractGraph{T}
>>>>>>     vertices::UnitRange{T}
>>>>>>     edges::Set{Edge{T}}
>>>>>>     finclist::Vector{Vector{Edge{T}}} # [src]: ((src,dst),
>>>>>> (src,dst), (src,dst))
>>>>>>     binclist::Vector{Vector{Edge{T}}} # [dst]: ((src,dst),
>>>>>> (src,dst), (src,dst))
>>>>>> end
>>>>>>
>>>>>> function Graph{T<:Integer}(n::T)
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> and g = Graph(5) works and produces a graph of type Graph{Int64},
>>>>>> but g = Graph{Int64}(5) produces
>>>>>>
>>>>>> ERROR: MethodError: `convert` has no method matching
>>>>>> convert(::Type{LightGraphs.Graph{Int64}}, ::Int64)
>>>>>>
>>>>>> This is a problem because I have
>>>>>>
>>>>>> function union{T<:AbstractGraph}(g::T, h::T)
>>>>>>     gnv = nv(g)
>>>>>>     r = T(gnv + nv(h))
>>>>>>     for e in edges(g)
>>>>>>         add_edge!(r,e)
>>>>>>     end
>>>>>>     for e in edges(h)
>>>>>>         add_edge!(r, gnv+src(e), gnv+dst(e))
>>>>>>     end
>>>>>>     return r
>>>>>> end
>>>>>>
>>>>>>
>>>>>>
>>>>>> Which is failing on line 3 (in the creation of the graph).
>>>>>>
>>>>>> What's the proper way of creating the object from a parameterized
>>>>>> type? Thanks.
>>>>>>
>>>>>

Reply via email to