私は単純なグラフ構造を作ろうとしていて、次のように書きました。しかし、GHG はエラーを発生させ、私はそこにスタックしました。独自の型クラスを作成するのはこれが初めてなので、何かひどく間違っている可能性があります。誰かが何が間違っているのか説明できますか?
同様の質問を見つけましたが、私のケースには当てはまらないと思います.: 型クラスのインスタンスで型変数をバインドする際にエラーが発生しました
class Link l where
node :: (Node n) => l -> n
class Node n where
links :: (Link l) => n -> [l]
data (Node n) => SimpleLink n =
SimpleLink
{ simpleLinkNode :: n
} deriving (Show, Read, Eq)
instance (Node n) => Link (SimpleLink n) where
node = simpleLinkNode
data (Link l) => SimpleNode l =
SimpleNode
{ simpleNodeLinks :: [l]
} deriving (Show, Read, Eq)
instance (Link l) => Node (SimpleNode l) where
links = simpleNodeLinks
これは私が得たエラーメッセージです:
***.hs:13:10:Could not deduce (n ~ n1)
from the context (Node n)
bound by the instance declaration
at ***.hs:12:10-40
or from (Node n1)
bound by the type signature for
node :: Node n1 => SimpleLink n -> n1
at ***.hs:13:3-23
`n' is a rigid type variable bound by
the instance declaration
at ***.hs:12:16
`n1' is a rigid type variable bound by
the type signature for node :: Node n1 => SimpleLink n -> n1
at ***.hs:13:3
Expected type: SimpleLink n -> n1
Actual type: SimpleLink n -> n
In the expression: simpleLinkNode
In an equation for `node': node = simpleLinkNode
***.hs:21:11:Could not deduce (l ~ l1)
from the context (Link l)
bound by the instance declaration
at ***.hs:20:10-40
or from (Link l1)
bound by the type signature for
links :: Link l1 => SimpleNode l -> [l1]
at ***.hs:21:3-25
`l' is a rigid type variable bound by
the instance declaration
at ***.hs:20:16
`l1' is a rigid type variable bound by
the type signature for links :: Link l1 => SimpleNode l -> [l1]
at ***.hs:21:3
Expected type: SimpleNode l -> [l1]
Actual type: SimpleNode l -> [l]
In the expression: simpleNodeLinks
In an equation for `links': links = simpleNodeLinks
編集 1
ダニエルの提案をいくつか試しました。しかし、私はそれらを機能させることができませんでした。
コンストラクタークラス
取得: 「`n' が十分な型引数に適用されていません」
class Link l n where
node :: Node n l => l n -> n l
class Node n l where
links :: Link l n => n l -> [l n]
マルチパラメータ型クラス (MPTC)
取得: 「クラス宣言内の循環 (スーパークラス経由)」
class (Node n) => Link l n where
node :: l -> n
class (Link l) => Node n l where
links :: n -> [l]
機能依存関係のある MPTC
取得: 「クラス宣言内の循環 (スーパークラス経由)」
class (Node n) => Link l n | l -> n where
node :: l -> n
class (Link l) => Node n l | n -> l where
links :: n -> [l]
目標 (編集 2)
実装したいのは、次のような有向非巡回グラフ構造 (より具体的にはFactor graph ) です。
(ソース: microsoft.com )
ノードには 2 種類 (白丸と赤四角) があり、異なる種類のノードにのみ接続されます。つまり、2 種類のリンクが存在します。
データ (配列) が接続されたノードとリンクの異なるバージョンが必要です。また、ノードとリンクが 1 種類しかない「バニラ」DAG も必要です。しかし、それらをトラバースするために、それを行うためのインターフェースを 1 つだけにしたいと考えています。