SML数据类型匹配冗余产生冗余



我从The Little MLer得到了这个

datatype 'a pizza =
Bottom
| Topping of ('a * ('a pizza))

和这个

datatype fish =
Anchovy
| Lox
| Tuna

这个工作代码

fun rem_fish (f, fp) =
let
fun eq_fish (Anchovy,Anchovy) = true
| eq_fish (Lox,Lox) = true
| eq_fish (Tuna,Tuna) = true
| eq_fish (_,_) = false
in
case fp of
Bottom => Bottom
| Topping(x,y) =>
case eq_fish (f,x) of
true => rem_fish (f,y)
| false => Topping (x,rem_fish (f,y))
end

它将采用一种鱼类型和一对鱼披萨,并在第一个自变量中删除特定的鱼

- rem_fish (Tuna, Topping (Tuna, (Topping (Anchovy, Topping (Lox, Topping (Tuna, Bottom))))));
Topping (Anchovy,Topping (Lox,Bottom)) : fish pizza

很好,所以我看到这个代码(我已经改为基于case(标记为"不符合语法"的

fun rem_fish (f, fp) =
case fp of
Bottom => Bottom
| Topping (f,fp') => rem_fish (f,fp')
| Topping (x,fp') => Topping (x,rem_fish (f,fp'))

但是这个错误

Error: match redundant
:           Bottom => ...
:           Topping (f,fp') => ...
:     -->   Topping (x,fp') => ...

这个错误是什么意思?代码出了什么问题?最后一行可能是这样的

Topping (_,fp') => Topping (?,rem_fish (f,fp'))

但我不知道CCD_ 2可能是什么。

我认为,如果我们在这段代码中消除一些不必要的阴影,它可能会变得更清晰。考虑功能

fun rem_fish (f, fp) =
case fp of
Bottom => Bottom
| Topping (y,fp') => rem_fish (y,fp')
| Topping (x,fp') => Topping (x,rem_fish (f,fp'))

这相当于你写的。

注意,对于Topping变体,Topping (y,fp')Topping (x,fp')都是无可辩驳的模式;所以在你的代码中,如果你有一个Topping,它将总是与case的第二个分支匹配,因此第三个分支是多余的(错误是怎么说的(。

如果您希望能够检查由Topping包装的元组中的第一个元素是否等于f,则需要使用op=显式执行此操作(强制其为相等类型(,或者将某种相等函数作为参数进行检查(或者像在初始示例中那样在内部进行检查(。后者可能看起来有点像

fun rem_fish (_, Bottom) _ = Bottom
| rem_fish (f, Topping (x, fp)) cmp = 
if cmp (f, x) then
rem_fish (f, fp)
else
Topping (x, rem_fish (f, fp))

最新更新