使用Bool与Finite 2时为何出现非穷举模式警告?
为什么基于
Finite 2定义Bool实例时会出现部分函数警告? 嘿,我来帮你理清楚这个问题~
首先,咱们得先搞明白GHC为什么会抛出这个警告:你虽然逻辑上知道Finite 2对应的索引只能是0和1(刚好对应Bool的两个值),但GHC的类型检查器没办法自动把Finite 2的约束和unFin的参数合法性绑定起来。它只会看到你调用了unFin这个函数,而默认情况下unFin的参数是任意自然数——GHC不知道你只会传入0或1,所以会认为这可能是个部分函数(毕竟如果传入大于1的数,unFin就会出错)。
那Conal建议的代码为什么能消除警告呢?核心在于它给了GHC明确的证据:你只处理了Finite 2对应的所有合法索引。举个常见的改进思路:
- 不用直接通过数值转换调用
unFin,而是对Finite 2的实例做穷尽模式匹配,比如:
这里GHC能看到你覆盖了instance YourClass Bool where yourFunc fin = case fin of FZ -> False FS FZ -> TrueFinite 2的所有可能构造器(因为Finite n的构造器数量是固定的n个),完全没有超出范围的可能,自然就不会再警告部分函数了。
简单来说,你之前的代码是“告诉GHC我知道参数合法”,而改进后的代码是“用代码证明参数一定合法”——GHC只认后者哦~
内容的提问来源于stack exchange,提问作者David Banas
相关产品推荐
相关产品推荐

