Ваш вопрос не имеет смысла в Haskell:
Скажем, у меня есть простой класс AClass
с открытым членом f1
, который можно переопределить.
Если вы думаете о «классах» с «открытыми членами», которые можно «переопределить», вы думаете об объектно-ориентированных терминах.Код, который вы показали, не представляет эти понятия вообще.См. Сообщение Тони Морриса «Классы типов не имеют ничего общего с интерфейсами».
класс типов определяет концепцию (в С ++ смысл , если это вообще помогает).Эта концепция состоит из некоторого набора функций, например:
class Eq a where
(==) :: a -> a -> Bool
... но без фактического поведения или реализации этих функций.Здесь нечего «переопределить».Типы данных, которые моделируют эта концепция будет предоставлять объявления экземпляров, например:
data Integer = {- ... -}
instance Eq Integer where
x == y = x `integerEq` y
data Float = {- ... -}
instance Eq Float where
x == y = x `floatEq` y
Таким образом, вы можете реализовать полиморфные алгоритмы, такие как:
allEqual :: Eq a => a -> a -> a -> Bool
allEqual a b c = (a == b) && (b == c)
Теперь вернемся кВаш вопрос, вы также можете определить классы типов, которые моделируют более конкретную концепцию , чем некоторые ранее определенные классы типов.Например:
class (Eq a) => Num a where
(+), (-), (*) :: a -> a -> a
Итак, есть экземпляры Eq
, которые не являются экземплярами Num
, но все экземпляры Num
должны быть экземплярами Eq
.В вашем примере вы можете захотеть что-то вроде этого:
class AClass a where
f1 :: a -> Int
class (AClass b) => BClass b where
f2 :: a -> Float
data Val = {- whatever -}
instance BClass Val where
f1 _ = 0
f2 _ = 0.0
Опять же, Val
не "наследует вкусности" как таковой, он просто говорит, что это экземпляр BClass
и, следовательно, также экземплярAClass
.Но это, очевидно, игрушечный код ...