История изменений
Исправление monk, (текущая версия) :
А ещё можно сделать так, чтобы тип add был не Number -> Number -> Number, а один из Int -> Int -> Int, Float -> Int -> Float…
{-# LANGUAGE TypeFamilies #-}
type family F a b where
F Int Int = Int
F a Float = Float
F Float a = Float
F a b = Float
class Number a b where
add :: a -> b -> F a b
instance Number Int Int where add = (+)
instance Number Float Float where add = (+)
instance (Integral a) => Number Float a where add a b = add b a
instance (Integral a) => Number a Float where add a b = fromIntegral a + b
Исходная версия monk, :
А ещё можно сделать так, чтобы тип add был не Number-> Number -> Number, а один из Int -> Int -> Int, Float -> Int -> Float…
{-# LANGUAGE TypeFamilies #-}
type family F a b where
F Int Int = Int
F a Float = Float
F Float a = Float
F a b = Float
class Number a b where
add :: a -> b -> F a b
instance Number Int Int where add = (+)
instance Number Float Float where add = (+)
instance (Integral a) => Number Float a where add a b = add b a
instance (Integral a) => Number a Float where add a b = fromIntegral a + b