В вашем определении all
вы, похоже, склоняетесь к мысли, что []
является общим списком, а не пустым списком.
Единственный шаблон, который фактически появляется в вашем определении all
- это [] []
(два пустых списка).Это наиболее убедительный случай неисчерпывающего сопоставления.
Поскольку вспомогательная функция qwe
выполняет реальную работу, в действительности нет никакого смысла иметь сопоставление с образцом на самом all
.Общая форма all
может быть такой:
fun all xs ys =
let
fun qwe = (*insert definition*)
in
qwe xs ys 0
end;
(использование zs
вместо ys
выглядит здесь немного неловко)
Определение que
должно иметь 2-4 паттернов.Определение 4-х шаблонов (требуется для некоторых функций, работающих с двумя списками):
fun qwe [] [] acc = (*insert def*)
| qwe [] (y::ys) acc = (*insert def*)
| qwe (x::xs) [] acc = (*insert def*)
| qwe (x::xs) (y::ys) acc = (*insert def*)
В последнем случае приведены 4 случая, по одному для каждой логической комбинации первого списка и второго списка, который является пустым.Иногда вам не нужно писать отдельный код для каждого из них.Например,
fun qwe [] [] acc = (*insert def*)
| qwe [] ys acc = (*insert def*)
| qwe (x::xs) ys acc = (*insert def*)
объединяет 3-й и 4-й случай в один случай.
Если вы посмотрите на свое фактическое определение elem
, вы поймете, что it прекрасно обрабатывает случай пустого ys
, поэтому в вашем определении qwe
вы можете просто иметь два шаблона на основе того, что делает xs
:
fun qwe [] ys acc = (*insert def*)
| qwe (x::xs) ys acc = (*insert def*)
Так как ys
можетсопоставляя как пустые, так и непустые списки, приведенный выше шаблон является исчерпывающим.
С соответствующими определениями (которые вы по существу уже имеете) для двух вышеупомянутых случаев que
ваша функция all
будет работать:
- all [1,2,3] [1,1,2,3,1,2,3,1];
val it = 3 : int