Я должен написать это в sml/nj Я сделал попытку, и вот что я сделал:
Я хочу, чтобы функция all возвращала положительное число, когда я запускаю функцию, но, например, когда я даю [1,2,3] [1,1,2,3,1,2,3,1]
ее
возвращает неполное совпадение.
Что не так с функцией и что я могу сделать, чтобы увидеть, если элементы
из первого списка существуют во втором?
fun elem num [] = false
| elem num (x::xs) = if num = x then true else elem num xs
fun all [] [] =
let
fun qwe [] [] acc = acc
| qwe (x::xs) (z::zs) acc = if elem x (z::zs) then qwe xs (z::zs) (1+acc) else qwe xs (z::zs) acc
in
qwe [] [] 0
end
В вашем определении 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
, вы поймете, что Это прекрасно обрабатывает случай пустого 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