haskell - Polymorphism with type variable? -
the title might not appropriate, please read on.
what want following : i'm writing 2d vector data
data vect = vect a deriving (show) and want write norm :: vect -> double function works vect a instance of integral or floating.
for double, can wrote:
norm :: vect double -> double norm (vect x y) = sqrt $ x^2 + y^2 but want function work vect int. can write function like:
normfromint :: (integral a) => vect -> double normfromint (vect x y) = sqrt . fromintegral $ x^2 + y^2 having 2 functions seems rather awkward. ways of achieving this?
i tried use special class this:
class vectorlike norm :: -> double instance (integral a) => vectorlike (vect a) norm (vect x y) = sqrt . fromintegral $ x^2 + y^2 -- | -- >>> norm (vect 3 4 :: vect int) -- 5.0 instance vectorlike (vect double) norm (vect x y) = sqrt $ x^2 + y^2 but this, when usnig `norm (vect 3.0 4.0 :: vect double) error
overlapping instances vectorlike (vect double) || print $ norm (vect 3.0 4.0 :: vect double) foo.hs|40 col 13 error| overlapping instances vectorlike (vect double) || arising use of `norm' || matching instances: || instance integral => vectorlike (vect a) || -- defined @ /home/yosh/foo.hs:26:10 || instance vectorlike (vect double) || -- defined @ /home/yosh/foo.hs:32:10 my question how can define norm works integers , floatings, , error message not main concern (it's puzzling me, think can work afterwards).
you need use realtofrac, converts real r => r value fractional f => f value:
norm :: (real r, floating f) => vect r -> f norm (vect x y) = sqrt . realtofrac $ x^2 + y^2 then work more types double, too.
as error message, don't technically have overlap on 2 instances, could. define integral double instance, import code. compiler can't decide instance use!
while precise situation not happen, type system allow instance integral double, , can occur other typeclasses , data types.
Comments
Post a Comment