Ну, функция 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