【问题标题】:Standard ML: Getting Last in List标准机器学习:排在最后
【发布时间】:2015-06-12 08:05:28
【问题描述】:

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

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

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

感谢您的帮助, 布莱曼

【问题讨论】:

  • 听起来你的问题不是如何获取列表中的最后一个元素,而是如何区分特定结果(在这种情况下为空列表)与域中的任意数据元素(整数在这种情况下)。我建议重新表述您的问题以反映您的意图。

标签: recursion sml


【解决方案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

希望对您有所帮助。

【讨论】:

  • 要引发的惯用异常是预定义的Empty,它也被其他列表函数使用。
【解决方案2】:

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

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

或者使用选项类型:

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

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

【讨论】:

  • 非常不鼓励使用非详尽的模式。最好明确提出异常。
猜你喜欢
  • 2010-12-14
  • 2013-08-05
  • 2021-09-02
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2013-01-29
  • 2019-01-11
相关资源
最近更新 更多