【问题标题】:How can I get the default value for a type?如何获取类型的默认值?
【发布时间】:2013-12-12 02:04:15
【问题描述】:

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

【问题讨论】:

    标签: haskell types default-value


    【解决方案1】:

    你不能。没有办法神奇地创建任何类型的值。

    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)
    

    现在你用Element node val edges 构造这些Elements 并且可以以几乎相同的方式进行模式匹配。超过 2 个元素的元组通常是错误的方法。

    【讨论】:

    • 也许应该提到mempty :: Monoid a => a?它可能看起来很合适,但我认为这是一个容易掉入的陷阱(即 mempty 仅对 mappend 才真正有用和有意义),需要警告。
    • @LucDanton 是的,Data.Default 是为这些情况明确定义的,Monoid 不是。
    • 非常感谢,我刚开始学习Haskell! 也许对我的目的和我目前所学的内容来说是一个非常好的主意。如何使用您的定义访问 Element 的成员?
    • @ShadowTemplate 我使用的是record。您可以使用val 访问一个值。所以val someElement 会给你里面的a
    • hackage.haskell.org/package/data-default-0.5.3 它定义了一个名为 Default 的类型类,并为 Haskell 中的大多数基本类型定义了一些默认值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2011-02-22
    • 2010-10-05
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多