У меня есть сценарий, который включает классы типов, и я не совсем уверен, как его решить.
у меня есть
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.
Я понимаю, что это довольно расплывчатое описание, но, пожалуйста, дайте мне знать, если я могу добавить что-нибудь еще.
Спасибо
convert
мог возвращать значение любого типаEvent
иSomething
, вам нужен способ построить значение любого типаEvent
иSomething
, зная только, что type принадлежит к этим двум классам. Вы можете дать одному из классов такой метод, какunraw :: ByteString -> a
, или, если такой метод по какой-то причине потребует использования возможностей обоих классов, создать новый класс, который наследует какEvent
, так иSomething
и имеет желаемый конструктор. - person jwodder   schedule 30.06.2011SomethingElse
, а не толькоByteString
? - person wuxb   schedule 30.06.2011