Как я могу сделать функцию, которая принимает два списка в качестве аргументов и возвращает true, если первый список существует во втором? - PullRequest
0 голосов
/ 02 апреля 2019

Я должен написать это в 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

1 Ответ

0 голосов
/ 03 апреля 2019

В вашем определении 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
...