機能依存性について質問があります。私の理解では、たとえば、私が書く場合class Graph g a b | g -> a, g -> b
、特定のものは1つのタイプのとg
にのみ関連付けることができます。実際、同じで異なる2つのインスタンスを宣言しようとすると、機能しません。a
b
g
a
b
ただし、次の場合、コンパイラ(ghc)は依存関係を使用できないようです。
class (Eq a, Eq b) => Graph g a b | g -> a, g -> b where
edges :: g -> [b]
src :: g -> b -> a
dst :: g -> b -> a
vertices :: g -> [a]
vertices g = List.nub $ map (src g) (edges g) ++ map (dst g) (edges g)
class Graph g a b => Subgraph g a b | g -> a, g -> b where
extVertices :: g -> [b]
data Subgraph1 g where
Subgraph1 :: Graph g a b => g -> [b] -> Subgraph1 g
instance Graph g a b => Graph (Subgraph1 g) a b where
vertices (Subgraph1 g _) = vertices g
edges (Subgraph1 g _) = edges g
src (Subgraph1 g _) = src g
dst (Subgraph1 g _) = dst g
パラメータと型アノテーションSubgraph1
を追加して修正すると、すべてがうまくいきます。a
b
data Subgraph1 g a b where
Subgraph1 :: Graph g a b => g -> [b] -> Subgraph1 g a b