Recursion 标准ML:获取列表中的最后一个

Recursion 标准ML:获取列表中的最后一个,recursion,sml,Recursion,Sml,我试图在SML中获取整数列表的最后一个元素,但我想(以某种方式)指出用户何时传入不可接受的列表(例如空列表)。我的代码在这里: fun lastInList [] = ~1 | lastInList [x] = x | lastInList (x::xs) = lastInList xs; 这适用于任何非空列表,因为执行总是在第一行之前的第二行。然而,有没有一种惯用的方法可以处理所有整数?我想我想返回某种例外情况。当前的解决方案不是很好,因为-1可以在我的列表中(显然)

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

fun lastInList [] = ~1
    | lastInList [x] = x
    | lastInList (x::xs) =
    lastInList xs;
这适用于任何非空列表,因为执行总是在第一行之前的第二行。然而,有没有一种惯用的方法可以处理所有整数?我想我想返回某种例外情况。当前的解决方案不是很好,因为-1可以在我的列表中(显然)

谢谢你的帮助, b外行

您可以随时:

另一个(请原谅这个双关语):

希望能有所帮助。

您可以随时:

另一个(请原谅这个双关语):


希望这能有所帮助。

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

fun last []      = raise Empty
  | last [x]     = x
  | last (_::xs) = last xs
或使用选项类型:

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

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

惯用的方法可能是允许函数在无效输入时失败:

fun last []      = raise Empty
  | last [x]     = x
  | last (_::xs) = last xs
或使用选项类型:

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

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

听起来您的问题不是如何获取列表中的最后一个元素,而是如何区分特定结果(本例中为空列表)和域中的任意数据元素(本例中为整数)。我建议重新表述您的问题以反映您的意图。听起来您的问题不是如何获取列表中的最后一个元素,而是如何区分特定结果(本例中为空列表)和域中的任意数据元素(本例中为整数)。我建议您重新表述您的问题,以反映您的意图。非详尽模式是非常不鼓励的。最好显式地引发异常。不鼓励使用非穷举模式。最好显式引发异常。要引发的惯用异常是预定义的
Empty
,其他列表函数也使用它。要引发的惯用异常是预定义的
Empty
,其他列表函数也使用它。