type SidType = Int
class (Eq a, Ord a) => Sided a where -- Данные имеющие '''SID'''
sid :: a -> SidType
data SympText = SympText {
tSid :: SidType,
text :: String
}
instance Sided SympText where
sid = tSid
instance Eq SympText where
a == b = sid a == sid b
instance Ord SympText where
compare a b = compare (sid a) (sid b)
type Category = Int
data SympCats = SympCats {
cSid :: SidType,
categ :: Category
}
instance Sided SympCats where
sid = cSid
instance Eq SympCats where
a == b = sid a == sid b
instance Ord SympCats where
compare a b = compare (sid a) (sid b)
Здесь видно, что для каждой стркуруры Symp* приходится рисовать совершенно одинаковые определения Eq и Ord.
Можно ли как-то это унифицировать?
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Здравствуйте, Tonal-, Вы писали:
T>Можно ли как-то это унифицировать?
instance Sided s => Eq s where
a == b = sid a == sid b
instance Sided s => Ord s where
compare a b = compare (sid a) (sid b)
Надо включить OverlappingInstances и
всё что он за ним тянет.
Здравствуйте, Tonal-, Вы писали:
T>T>type SidType = Int
T>class (Eq a, Ord a) => Sided a where -- Данные имеющие '''SID'''
T> sid :: a -> SidType
T>data SympText = SympText {
T> tSid :: SidType,
T> text :: String
T>}
T>instance Sided SympText where
T> sid = tSid
T>instance Eq SympText where
T> a == b = sid a == sid b
T>instance Ord SympText where
T> compare a b = compare (sid a) (sid b)
T>type Category = Int
T>data SympCats = SympCats {
T> cSid :: SidType,
T> categ :: Category
T>}
T>instance Sided SympCats where
T> sid = cSid
T>instance Eq SympCats where
T> a == b = sid a == sid b
T>instance Ord SympCats where
T> compare a b = compare (sid a) (sid b)
T>
T>Здесь видно, что для каждой стркуруры Symp* приходится рисовать совершенно одинаковые определения Eq и Ord.
T>Можно ли как-то это унифицировать?
Заверни в ньютайп:
f `on` g = \x y -> g x `f` g y
newtype SidedWrapper a = SidedWrapper {fromSidedWrapper :: a}
instance Sided a => Eq (SidedWrapper a) where (==) = (==) `on` sid
instance Sided a => Ord (SidedWrapper a) where compare = compare `on` sid
instance Sided a => Sided (SidedWrapper a) where sid = sid . fromSidedWrapper
type SympCatsW = SidedWrapper SympCats
type SympTextW = SidedWrapper SympText
Здравствуйте, lomeo, Вы писали:
L>Здравствуйте, Tonal-, Вы писали:
T>>Можно ли как-то это унифицировать?
L>L>instance Sided s => Eq s where
L> a == b = sid a == sid b
L>instance Sided s => Ord s where
L> compare a b = compare (sid a) (sid b)
L>
L>Надо включить OverlappingInstances и всё что он за ним тянет.
С этого обычно начинается жопа.