0

Haskell で少し大きなものを構築する方法を学ぶために、グラフ ライブラリを作成していますが、問題が発生しています。

基本的に、s を点とEdge点の 2 つの点のセットとして定義しようとしています。しかし、私は複数のタイプのエッジ (加重/非加重) を持っており、それらをs に混在させたくありません。fromtograph

そのため、私が目指している量のポリモーフィックな動作を達成できるようにするためにWeighted、いくつかの新しいクラスを作成するというアイデアがありました。Edgyの両方のタイプが にEdgeなりますEdgyが、加重Edgeタイプのみが になりますWeighted

Weightedオブジェクト全体を変更するだけなので、クラスは単純です。これは次のようになります。

class Weighted a where
  modifyWeight :: (Unbounded Int -> Unbounded Int) -> a -> a

whereUnboundedは無限に大きい数と小さい数をサポートするために一緒に投げた Num 型です。ただし、 . を返すだけでよいので、簡単aです。

私が立ち往生しているのは、Edgyクラスがクラス型の型の何かを返すようにすることです(???これをどのように配置するか、おそらく内部型ではありませんか?)。これをより明確にするために、私が取り組んでいるものは次のとおりです。

class Edgy a where
  to :: a -> Vertex a
  from :: a -> Vertex a

whereVertexはラッパー クラスEdgeです。ここで作成しようとしている宣言は次のとおりです。

data Edge a = Edge (Vertex a) (Vertex a) deriving (Show, Eq)

data WEdge a = WEdge (Vertex a) (Vertex a) (Unbounded Int) deriving (Show, Eq)

だから、私が本当にやろうとしているのは、「オーケー、あなたがクラスのメンバーなら、の型のEdgya を返すことができるはずだ」と言うことです。VertexEdge

しかし、GHC はこれを好まない.なぜなら in のa型はEdgy結局Edge aの代わりにaなるからである.それをクラスに「降下」させてその型を取り出してそれを返す方法がわからないからだ.

このいずれかが不明な場合は、コメントを残してください。

どんな助けでも大歓迎です。私は困惑しています!

ありがとう!

4

1 に答える 1

3

型クラスではなく、型コンストラクター クラスを使用したい場合があります。

class Edgy e where
    to :: e a -> Vertex a
    from :: e a -> Vertex a

instance Edgy Edge where ...
于 2012-12-13T16:59:56.880 に答える