试图了解这些参数化类型在Haskell中如何工作,例如:
data List a = Nil | Cons a (List a)
data Either a b = Left a | Right b
data Tree a = Nil | Node a (Tree a) (Tree a)
data Tree = Branch [Tree]
data Tree a = Node a [Tree a]
要使其复杂一点,我想查看bipartite graph的定义,基本上是一个具有两组节点的图,其中节点仅连接到另一组节点。
所以..(在JavaScript中)....数据如何连接的示例如下:
var typeA_node1 = { id: 'a1' }
var typeA_node2 = { id: 'a2' }
var typeA_node3 = { id: 'a3' }
var typeB_node1 = { id: 'b1' }
var typeB_node2 = { id: 'b2' }
var typeB_node3 = { id: 'b3' }
typeA_node1.right = typeB_node3
typeB_node3.right = typeA_node2
typeA_node2.right = typeB_node2
typeB_node2.right = typeA_node3
typeA_node3.right = typeB_node1
基本上,a--b--a--b--a--b--a--b
中,a始终仅连接到b,而不连接到a。一个a
可以连接到许多b
节点,我只是在示例中没有显示。
想知道如何在Haskell(或其他方式)中使用data
或type
正确地定义它。
答案 0 :(得分:2)
我将使用Data.Set
来构造两组顶点,并为边缘构造另一组顶点。现在将它们包装在隐藏它们的模块中。
module BiPartiteGraph (create) where
import qualified Data.Set as Set
data BiPartiteGraph a = BiPartiteGraph (Set.Set a) (Set.Set a) (Set.Set (a, a)) -- (U, V, E)
-- Construct a BiPartiteGraph from a list of edges
create :: Ord a => [(a, a)] -> BiPartiteGraph a
create _ = undefined
-- Implementation of the show function
instance (Show a) => Show (BiPartiteGraph a) where
show _ = undefined