haskell - 扩展代数数据类型

标签 haskell algebraic-data-types

注意:如果这个问题有点奇怪,那是因为我最近才接触 Haskell,并且仍在适应函数式思维。

考虑像 Maybe 这样的数据类型:

data MyOwnMaybe a = MyOwnNothing | MyOwnJust a

每个使用我的数据类型的人都会编写类似的函数
maybeToList :: MyOwnMaybe a -> [a]
maybeToList MyOwnNothing  = []
maybeToList (MyOwnJust x) = [x]

现在,假设稍后我希望扩展此数据类型
data MyOwnMaybe a = MyOwnNothing | MyOwnJust a | SuperpositionOfNothingAndJust a

我如何确保每个人的函数都会在编译时中断?

当然,有可能不知何故我没有“获取”代数数据类型,也许我根本不应该这样做,但考虑到数据类型 Action
data Action = Reset | Send | Remove

似乎添加了一个额外的 Action喜欢 Add不会那么罕见(我不想冒险拥有所有这些可能无法处理我的新功能 Action )

最佳答案

您似乎知道 GHC 可以通过 -W 警告函数中的非穷尽模式匹配。标记或明确使用 -fwarn-incomplete-patterns .

关于为什么这些警告不会在这个 SO 问题中自动编译时错误有一个很好的讨论:

In Haskell, why non-exhaustive patterns are not compile-time errors?

另外,请考虑这种情况,其中您有一个带有大量构造函数的 ADT:

data Alphabet = A | B | C | ... | X | Y | Z

isVowel :: Alphabet -> Bool
isVowel A = True
isVowel E = True
isVowel I = True
isVowel O = True
isVowel U = True
isVowel _ = False

使用默认情况是为了方便避免必须写出其他 21 种情况。

现在,如果您向 Alphabet 添加一个加法构造函数, 应该 isVowel被标记为“不完整”?

关于haskell - 扩展代数数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32299317/

相关文章:

haskell - gtkhs 中 Widget 类的自定义实现

Haskell 快照 : Session example

optimization - 解包严格字段如何与多态性结合在一起?

rx-java - 如何在没有 .flatMap 的情况下控制流,这会破坏 react 流,从而阻止 distinctUntilChanged 等运算符在整个流上工作

haskell - 是否存在使用代数数据类型或多态性的 OOP 抽象类的 Haskell 等效项?

Haskell 使用元组定义多个函数

haskell : how to get fix point of a function?

haskell - 为什么递归 `let` 可以提高空间效率?

scala - 在计算机术语中, "non-directory"叫什么?

data-structures - 数据结构差异化,直觉构建