I am rebuilding my framework (recommender systems).
I’m thinking about a new modeling of the problem and I’m testing some things.
However, I was left with some doubts and I did not find a solution here.
I created a wrapper for the integer and it will be my identifier.
I would like to call functions using integers and would not like to be converting it.
Is it possible to do this?
Example:
module Persa
# package code goes here
import Base: convert, promote_rule
struct ID
value::Int
end
struct Rating{T <: Number}
user::ID
item::ID
value::T
end
Base.promote_rule(::Type{ID}, ::Type{Int}) = ID
Base.convert(::Type{Persa.ID}, x::Int) = Persa.ID(x)
end # module
When I call this function, Julia don´t convert my type automatically.
rating = Persa.Rating(Persa.ID(1), 2, 5)
Thanks!
The problem here seems to be with the type parameter T
in struct Rating{T <: Number}
.
Because the existence of T
, Persa.Rating
includes everything like Persa.Rating{Int}
, Persa.Rating{Float64}
, etc.
So Julia doesn’t know which one is the target type of Persa.Rating(x)
, and it won’t use implicit conversion at all.
And if we give information for T
, things will be okay, for example:
rating = Persa.Rating{Int}(Persa.ID(1), 2, 5)
rating = Persa.Rating{Float64}(Persa.ID(1), 2, 5)
1 Like
It worked here. Makes sense.
I’ve tried here to write an extra constructor, but it did not work either.
The function did not remove the ambiguity.
Rating(user::ID, item::ID, value::T) where T <: Number = Rating{T}(user, item, value)
I think I’m going to give up this path and put directly as an integer.
Thank you!
Define
Rating(user, item, value::T) where T <: Number = Rating{T}(user, item, value)
should work.
So julia knows to get T
from the type of value
.
So, It don’t work too.
The error message is completely empty.
Like:
Error: StackOverFlowError:
Edit:
Works! Thanks!
The error appears when you set it this way:
Rating(user, item, value::T) where T <: Number = Rating(user, item, value)
However, this behavior is very strange.
The stack overflow error is because the method definition Rating(user, item, value::T) where T <: Number = Rating(user, item, value)
is really a circular one, the RHS is of the form of LHS.
1 Like
Yes, after reviewing I realized.
However, the error message did not help.