2011-06-30 110 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