От GHCI:Haskell: Почему (+), (-) часть Num typeclass?
Prelude> :i Num
class Num a where
(+) :: a -> a -> a
(-) :: a -> a -> a
(*) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
-- Defined in `GHC.Num'
instance Num Word -- Defined in `GHC.Num'
instance Num Integer -- Defined in `GHC.Num'
instance Num Int -- Defined in `GHC.Num'
instance Num Float -- Defined in `GHC.Float'
instance Num Double -- Defined in `GHC.Float'
Почему (+)
, (-)
часть класса Num начать?
Например - вы можете легко определить этот тип класса:
class Plus a where
(+) :: a -> a -> a
А потом пусть:
instance Plus [] where
(+) = (++)
И вы можете также определить их для множеств означает установить соединение, или добавить (-)
к тип типа для обозначения разности заданий ... И нет смысла определять signum
в списке.
Конечно, я мог бы создать свой собственный класс типа, который использует (|+|)
вместо - но почему эти операторы зарезервированы в haskell для Num только?
Так почему же этот выбор был сделан? Это связано с наследием или никто этого не хотел?
Haskell, практическое использование: P? Я думал, что это для размышлений только ^, - – Centril
К сожалению, 'signum' (что за черт был даже предназначен?) И' abs' (который имеет неправильный тип, который действительно полезен для сложных чисел). К сожалению, представления с плавающей запятой - это экземпляры 'Num', несмотря на то, что они не очень похожи на числа. Другим неудачным фактом является то, что натуральные числа вообще не поддерживают '(-)' или 'отрицать'. – dfeuer
Я думаю, что основным аргументом является то, что 'Num' был вызван прежде всего практическими проблемами. Синтаксис в основном идентичен другим языкам, и он работает исправно большую часть времени для большинства распространенных типов и видов использования. К сожалению, он разбивается на крайние случаи. Я не согласен, что печально, что представления с плавающей запятой являются экземплярами 'Num'; скорее я бы предположил, что некоторые из вариантов IEEE754 являются неудачными. –