Проблема с иерархией классов типов Haskell

У меня есть сценарий, который включает классы типов, и я не совсем уверен, как его решить.

у меня есть

class Event a where
     timestamp :: a -> UTCTime
     rawData :: a -> ByteString

class Something a where
    something :: a -> SomethingElse

В своем коде я хочу создать объект, который реализует как Event, так и Something. Однако в некоторых случаях функции something потребуется возврат из вызова rawData для создания объекта SomethingElse. Мне было интересно, нужно ли структурировать эти классы типов, чтобы иметь возможность создавать такие функции, как

convert :: (Event a, Event b, Something b) => a -> b

возможность вызывать convert x :: (экземпляр чего-либо) для преобразования, что немного похоже на то, как используется двоичный код get.

Я понимаю, что это довольно расплывчатое описание, но, пожалуйста, дайте мне знать, если я могу добавить что-нибудь еще.

Спасибо


person Charles Durham    schedule 30.06.2011    source источник
comment
Я не совсем понимаю, о чем вы спрашиваете, но для того, чтобы convert мог возвращать значение любого типа Event и Something, вам нужен способ построить значение любого типа Event и Something, зная только, что type принадлежит к этим двум классам. Вы можете дать одному из классов такой метод, как unraw :: ByteString -> a, или, если такой метод по какой-то причине потребует использования возможностей обоих классов, создать новый класс, который наследует как Event, так и Something и имеет желаемый конструктор.   -  person jwodder    schedule 30.06.2011
comment
вы должны дать некоторый контекст SomethingElse, а не только ByteString?   -  person wuxb    schedule 30.06.2011
comment
В значительной степени SomethingElse — это просто десериализованный объект, где строка байтов — это сериализованная версия.   -  person Charles Durham    schedule 30.06.2011


Ответы (1)


В классе типов Something вам нужно убедиться, что тип a реализовал класс типов Event, поэтому определение Something становится таким:

class Event a => Something a where
     something :: a -> SomethingElse
person Ankur    schedule 30.06.2011
comment
Как бы я абстрагировался, если что-то не всегда нуждается в событии. Допустим, только в определенных случаях Нечто конструируется событием. Как бы я организовал эту иерархию? Я не знаком со стандартными объектно-ориентированными практиками. - person Charles Durham; 05.07.2011
comment
В этом случае вы можете удалить ограничение (Event a) из класса типа Something и поместить это ограничение в новый метод внутри класса Something.. somethingFromEvent... этот метод создаст что-то из события, и параметр этого метода должен иметь экземпляр класса событий. - person Ankur; 05.07.2011