Haskell で少し大きなものを構築する方法を学ぶために、グラフ ライブラリを作成していますが、問題が発生しています。
基本的に、s を点とEdge
点の 2 つの点のセットとして定義しようとしています。しかし、私は複数のタイプのエッジ (加重/非加重) を持っており、それらをs に混在させたくありません。from
to
graph
そのため、私が目指している量のポリモーフィックな動作を達成できるようにするために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)
だから、私が本当にやろうとしているのは、「オーケー、あなたがクラスのメンバーなら、の型のEdgy
a を返すことができるはずだ」と言うことです。Vertex
Edge
しかし、GHC はこれを好まない.なぜなら in のa
型はEdgy
結局Edge a
の代わりにa
なるからである.それをクラスに「降下」させてその型を取り出してそれを返す方法がわからないからだ.
このいずれかが不明な場合は、コメントを残してください。
どんな助けでも大歓迎です。私は困惑しています!
ありがとう!