Параметры функций SML - PullRequest
       7

Параметры функций SML

0 голосов
/ 30 октября 2011

Условие:
когда 1. список длиннее 2. список Возвращаемое значение: 1
когда 1. список имеет то же количество элементов, что и 2. список Возвращаемое значение: 0 когда 1. список был короче чем w. Возвращаемое значение списка: ~ 1

([1,2,4,5],[3,2,5]);
1

([1,2],[1,5]);
 0

([5],[8,2,3]);
~1

1 Ответ

1 голос
/ 30 октября 2011

Ну, функция length может быть вашим другом в этом случае:

fun foo (xs, ys) =
    let
      val len_xs = length xs
      val len_ys = length ys
    in
      case (len_xs < len_ys, len_xs > len_ys) of
        (true, false) => ~1
      | (false, true) => 1
      | (false, false) => 0
    end

, который даст результаты:

- foo ([1,2,4,5],[3,2,5]);
val it = 1 : int
- foo ([1,2],[1,5]);
val it = 0 : int
- foo ([5],[8,2,3]);
val it = ~1 : int

Однако это неэффективно и уродливо. Таким образом, мы также можем просто извлечь по одному элементу из каждого списка за раз, пока один из них (или оба) не опустеет:

fun bar ([], []) = 0
  | bar (_, []) = 1
  | bar ([], _) = ~1
  | bar (_ :: xs, _ :: ys) = bar (xs, ys)

Что дает результаты:

- bar ([1,2,4,5],[3,2,5]);
val it = 1 : int
- bar ([1,2],[1,5]);
val it = 0 : int
- bar ([5],[8,2,3]);
val it = ~1 : int
...