У меня есть это 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
который возьмет тип fi sh и пару пиццы fi sh и удалит этот конкретный fi sh в первом аргументе
- 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'))
, но тогда я не знаю, что могло бы быть ?
.