标准 ML:排在最后

Standard ML: Getting Last in List

我正在尝试获取 SML 中整数列表的最后一个元素,但我想(以某种方式)指示用户何时传入不可接受的列表(例如空列表)。我的代码在这里:

fun lastInList [] = ~1
    | lastInList [x] = x
    | lastInList (x::xs) =
    lastInList xs;

这适用于任何非空列表,因为执行总是在第一行之前到达第二行。但是,是否有一种能够处理所有整数的惯用方法?我想 return 某种例外,我想。当前的解决方案不是很好,因为 -1 可以在我的列表中(很明显)。

感谢您的帮助, 克莱曼

你总是可以raise an exception:

fun last []      = raise Empty
  | last (x::xs) = last' x xs

fun last' x []      = x
  | last' _ (x::xs) = last' x xs

另一个option(请原谅我的双关语):

fun last []      = NONE
  | last (x::xs) = SOME (last' x xs)

fun last' x []      = x
  | last' _ (x::xs) = last' x xs

希望对您有所帮助。

惯用的方法是让函数在无效输入时失败:

fun last []      = raise Empty
  | last [x]     = x
  | last (_::xs) = last xs

或使用选项类型:

fun last' []      = NONE
  | last' [x]     = SOME x
  | last' (_::xs) = last' xs

这也适用于任何通用列表,而不仅仅是整数列表。