2011-06-30 83 views
1

我有一个涉及类型类的场景,我不太清楚如何去解决它。Haskell类型结构问题

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

class Something a where 
    something :: a -> SomethingElse 

在我的代码,我想创建一个实现两个事件有什么东西的对象。但是,在某些情况下,某些函数需要从调用rawData返回来构造SomethingElse对象。我在想,如果有来构建这些类型类是能够建立一个功能类似

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

能够调用转换X ::(某些实例),以转化,有点像如何二进制GET用来。

我意识到这是一个相当模糊的描述,但请让我知道如果我可以添加任何其他东西。

感谢

+0

我并不完全清楚你” re要求,但为了让'convert'能够返回任何'Event'&'Something'类型的值,你需要一种方法来构造任何'Event'&'Something'类型的值,同时只知道该类型属于这两个类。你可以为其中一个类提供一个像'unraw :: ByteString - > a'这样的方法,或者如果这样的方法需要利用这两个类的特性,可以创建一个继承了'Event'和'Something'的新类并具有所需的构造函数。 – jwodder

+0

你必须给'SomethingElse'一些上下文,方式不只是'ByteString'? – Nybble

+0

SomethingElse只是一个反序列化的对象,其中bytestring是序列化版本 –

回答

2

在您需要确保该类型已实施型类的事件类型的类的东西,所以东西的定义变成:

class Event a => Something a where 
    something :: a -> SomethingElse 
+0

如果Something不总是需要事件,我会如何抽象出它。可以说只有在某些情况下,某件事是由事件构成的。我将如何组织这个层次结构?我不熟悉标准的面向对象的实践。 –

+1

在这种情况下,您可以从Something类型类中删除(Event a)限制,并将此限制放在Something类中的新方法.. somethingFromEvent ...此方法将从事件创建某些内容,并且此方法的参数必须具有Event类的实例。 – Ankur