2011-06-30 10 views
1

私は、型のクラスを含むシナリオを持っていますが、私はそれを解決する方法についてはあまりよく分かりません。Haskell typeclass階層の問題

私は私のコードで

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

class Something a where 
    something :: a -> SomethingElse 

を持って、私はイベントや何かの両方を実装するオブジェクトを作成したいです。しかし、場合によっては、SomethingElseオブジェクトを構築するためにrawDataへの呼び出しからの戻りが必要になることがあります。 Xを変換呼び出すことができること

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

のような機能を構築することができるように、これらの型クラスを構造化することがあった場合、私は思っていた::(何かのインスタンス)に変換するためには、どのようにバイナリ取得のようなビット使用されている。

私はこれがかなり曖昧な記述であることを認識していますが、他に何か追加できるかどうか教えてください。型クラスで

おかげ

+0

私はあなたが「何を完全には明らかではありませんよしかし、 'convert'が' Event'と 'Something'型の値を返すためには' Event'と 'Something'型の値を構築する方法が必要ですその型はその2つのクラスに属します。クラスの1つに 'unraw :: ByteString - > a'のようなメソッドを与えることもできますし、何らかの理由で両方のクラスの機能を利用する必要がある場合は、' Event'と 'Something'の両方を継承する新しいクラスを作りましょう所望のコンストラクタを有する。 – jwodder

+0

あなたは 'SomethingElse'にいくつかの文脈を与えなければなりません。ちょうど' ByteString'ではなく? – Nybble

+0

かなり多くのSomethingElseは、バイトストリームがシリアライズされたバージョンであるデシリアライズされたオブジェクトです。 –

答えて

2

あなたはタイプA、タイプクラスのイベントを実施していることを確認する必要があるもの、それ故に何かの定義は次のようになります。

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

Somethingが必ずしもイベントを必要としない場合、どのように抽象化しますか?場合によっては、イベントによって何かが構築されるとしか言いません。その階層をどのように整理するのですか?私は、標準的なオブジェクト指向の実践に精通していません。 –

+1

その場合、Something型クラスから(Event a)制限を削除し、Somethingクラス内の新しいメソッドにこの制限を設定することができます.. somethingFromEvent ...このメソッドはイベントから何かを作成し、このメソッドへのパラメータはa Eventクラスのインスタンス – Ankur

関連する問題