注意:如果这个问题有点奇怪,那是因为我最近才接触 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/