[Haskell] Одинаковые реализации классов типов
От: Tonal- Россия www.promsoft.ru
Дата: 11.09.09 10:12
Оценка:
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>>
Re: [Haskell] Одинаковые реализации классов типов
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 11.09.09 13:06
Оценка: 50 (3)
Здравствуйте, 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 и всё что он за ним тянет.
Re: [Haskell] Одинаковые реализации классов типов
От: MigMit Россия http://migmit.vox.com
Дата: 12.09.09 13:45
Оценка: 17 (2)
Здравствуйте, 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
Re[2]: [Haskell] Одинаковые реализации классов типов
От: MigMit Россия http://migmit.vox.com
Дата: 12.09.09 13:46
Оценка:
Здравствуйте, 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 и всё что он за ним тянет.


С этого обычно начинается жопа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.