标准ML:列入最后列表

时间:2015-06-11 15:30:00

标签: recursion sml

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

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

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

感谢您的帮助, bclayman

2 个答案:

答案 0 :(得分:3)

您可以随时raise an exception

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

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

另一个option(如果你原谅双关语):

BEFORE

希望有所帮助。

答案 1 :(得分:2)

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

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

或使用选项类型:

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

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