SML больше двух списков

Нужна помощь с проблемой SML, которую я не могу решить. В основном у меня есть два списка, и мне нужно вернуть большее из каждого списка.

Пример вызова:

Greater([8,4,12,5,6],[2,6,14,4,5]);

Вернул бы (8,6,14,6).

Я только начал работать со списками в SML и даже не знаю, с чего начать.


person user3091510    schedule 11.12.2013    source источник
comment
В возврате всего четыре значения. Должно ли возвращаемое значение быть (8,6,14,5,6)?   -  person ben rudgers    schedule 11.12.2013


Ответы (3)


val greater = List.map Int.max o ListPair.zip

Или расширить это:

fun greater(nil, nil)     = nil
  | greater(x::xs, y::ys) = (if x > y then x else y)::greater(xs, ys)
  | greater(_, _)         = raise Domain
person Andreas Rossberg    schedule 11.12.2013
comment
Спасибо за быстрый ответ! Есть ли способ сделать это с точки зрения функции? Просто пытаюсь увидеть, как все это рушится. Никогда не использовал ListPair.zip, поэтому не уверен, что именно он делает. - person user3091510; 11.12.2013
comment
@ user3091510, добавлена ​​автономная реализация. - person Andreas Rossberg; 11.12.2013
comment
О, и ListPair.zip создает список пар из пары списков. - person Andreas Rossberg; 11.12.2013

Предполагая, что у вас есть два списка одинаковой длины, вы можете определить эту функцию:

fun greater nil nil = nil
  | greater (x::xs) (y::ys) = 
       if x > y then x::(greater xs ys) else y::(greater xs ys);

Или, альтернативно, сведя задачу к отображению списка пар целых чисел в список целых чисел:

fun zip nil nil = nil
  | zip (x::xs) (y::ys) = (x,y)::(zip xs ys);

fun max (x,y) = if x > y then x else y;

fun greater xs ys = map max (zip xs ys);

Обратите внимание, что списки в ML обозначаются как [1,2,3], а не (1,2,3), который представляет собой кортеж из трех элементов. Затем эта функция вызывается как:

- greater [1,2,3,4] [2,3,4,5];
val it = [2,3,4,5] : int list

- greater [~1,8,3] [8,~1,~2];
val it = [8,8,3] : int list
person Community    schedule 11.12.2013

даже лучше:

val greater = ListPair.map Int.max
person newacct    schedule 12.12.2013