【问题标题】:More Concise Pattern Matching on ADT with Multiple Data Types?多数据类型的 ADT 上更简洁的模式匹配?
【发布时间】:2014-09-15 09:50:24
【问题描述】:

假设我有以下代数数据类型:

data Foo = Bar Int | Baz Int | Bippy

我正在编写一个函数,给定一个 Foo,除了 Bippy 之外的任何内容都返回 True。

有没有比对所有数据类型进行模式匹配更简洁的方法来实现这个功能?

f :: Foo -> Bool
f (Bar _) = True
f (Baz _) = True
f Bippy = False

在这个例子中,只用了 3 行代码。但是,如果我有 10 种数据类型呢?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    怎么样

    f :: Foo -> Bool
    f Bippy = False
    f _ = True
    

    而且您没有 3 种数据类型,您有 3 个 构造函数 用于 1 种数据类型。

    【讨论】:

    • 感谢您的指正!我知道问题中没有提到它,但是是否可以匹配 BarBaz 以仅使用 1 个模式提取 Int
    • 您可以使用记录语法:data Foo = Bar { getInt :: Int } | Baz { getInt :: Int } | Bippy,然后是p :: Foo -> Maybe Int; p Bippy = Nothing; p b = Just (getInt b)。您可以稍后使用 ViewPatterns: f (p -> Just _) = True; f _ = False 重用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2013-03-17
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多