如何获取类型的默认值?

时间:2013-12-11 17:43:15

标签: haskell types default-value

我正在尝试在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的默认值? 非常感谢提前!

1 个答案:

答案 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个元素的元组通常是错误的方法。