我正在尝试在Haskell中构建图形ADT。 我不知道如何获得泛型类型的默认值。
type Node = Int
type Element a = (Node, a, [Int]) --Node: ID; a: generic value; [Int]: adjancent nodes' IDs
type Graph a = [Element a]
insNode :: Graph a -> Node -> Graph a
insNode g n = g ++ [(n,?,[])]
我需要写什么代替?为了获得类型a的默认值? 非常感谢提前!
答案 0 :(得分:6)
你做不到。没有办法神奇地创造任何类型的值。
有undefined :: a
,但如果评估过这会导致程序崩溃。相反,我建议
type Element a = (Node, Maybe a, [Int]) -- It's optional to have a value
或
insNode :: a -> Node -> Graph a -> Graph a
-- Optional idea, use `Data.Default` to ease the typing burden
defInsNode :: Def a => Node -> Graph a -> Graph a
defInsNode = insNode def
使用第一个选项,您可以将Nothing
放在那里(这就是您拥有的),或者使用第二个选项,您只需要用户提供一个值。
最后是一个样式注释,而不是元组的同义词,我建议使用
type Node = Int
data Element a = Element { node :: Node
, val :: Maybe a
, edges :: [Node]}
deriving (Eq, Show)
现在,您使用Elements
构建这些Element node val edges
,并且可以以相同的方式进行模式匹配。超过2个元素的元组通常是错误的方法。