У меня есть некоторые трудности, чтобы понять, когда вы используете и когда не используете typeclass в моем коде. Я имею в виду создать мои собственные, а не использовать уже определенные модельные стекла, конечно. К примеру (очень глупый пример), я должен делать:Должен ли я использовать класс или нет?
data Cars = Brakes | Wheels | Engine
data Computers = Processor | RAM | HardDrive
class Repairable a where
is_reparaible :: a -> Bool
instance Repairable Cars where
is_repairable (Brakes) = True
is_repairable (Wheels) = False
is_repairable (Engine) = False
instance Repairable Computers where
is_repairable (Processor) = False
is_repairable (RAM) = False
is_repairable (HardDrive) = True
checkState :: (Reparaible a) => a -> ...
checkState a = ...
(Очевидно, что это глупо, неполный пример).
Но это очень мало для использования, нет? Почему я не должен делать что-то простое и только определять функции без определения новых типов данных и типов (с их экземплярами).
Этот пример слишком прост, но на практике я часто вижу такие вещи (новые типы данных + типы + экземпляры), когда я просматриваю код Haskell на github вместо определения только функций.
Итак, когда я должен создавать новые типы данных, типы и т. Д. И когда следует использовать функции?
Спасибо.
Да! Это очень полный ответ, спасибо вам большое! Ваш «не использовать классы типов, если ...» будет особенно полезен для выбора хорошего способа сделать что-то. – vildric
Я бы добавил, что «не используйте typeclasses только для одного метода», хотя это не совсем жесткое правило, больше похоже на общий намек. – MathematicalOrchid
@MathematicsOrchid Это своего рода часть правила «законов потребности», поскольку у вас редко будут законы для класса типа только с одним методом (за исключением чего-то вроде «SemiGroup», где у вас есть закон ассоциативности) –