LINUX.ORG.RU

История изменений

Исправление 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