【问题标题】:Haskell unwrap dataHaskell 解包数据
【发布时间】:2016-11-28 06:06:21
【问题描述】:

如果你有数据类型

data Something = foo Integer 
               | bar Bool

我是否定义了“getter”来展开Something 类型以获取Integer 或Bool?现在它就像 (foo Integer) 和 (bar Bool)。我只想要整数或布尔值。

【问题讨论】:

  • 您可以编写data Something = Foo { getInteger :: Integer } | Bar { getBool :: Bool } 并免费获得getInteger :: Something -> IntegergetBool :: Something -> Bool 函数(但如果输入错误,它们会严重失败)。

标签: haskell types unwrap


【解决方案1】:

嗯,首先你有一个错字:数据构造函数必须是大写的:

data Something = Foo Integer
               | Bar Bool

您所要求的正是模式匹配的用途。如果您有一个名为sSomething 值:

case s of
  Foo f -> ... -- f is of type Integer in this "block"
  Bar b -> ... -- b is of type Bool in this "block"

这就是您通常处理此问题的方式,因为如果使用“错误”构造函数构造此类数据类型的任何类型的 getter,则会引发错误,这允许您处理这种情况。你可以Maybe之类的东西来做一个安全的getter,但是很多时候这最终会涉及更多的样板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多