SML函数参数

时间:2011-10-30 18:46:01

标签: sml smlnj

条件:
当1.列表长于2.列表返回值:1
当1. list具有与2. list相同数量的元素时返回值:0 当1.列表比w短时。 list返回值:~1

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

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

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

1 个答案:

答案 0 :(得分:1)

在这种情况下,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