【问题标题】:ML a real list return a real numberML 一个实数列表返回一个实数
【发布时间】:2017-09-20 00:58:58
【问题描述】:

我目前正在从事一个 ML 小型项目并学习如何使用它,但这里有一些我面临的问题,但在网上找不到任何来源。

我想要一个函数来返回列表的最后一个数字,这是一个实数列表。我写了一个代码来返回一个单元素实数列表,但我希望它是一个实数而不是一个列表。这是我的代码:

fun last [] = nil
  | last(head::nil) = [head]
  | last(head::list) = last(list)

我以为

last(head::nil)=head

将有助于获得真实的数字,但它只会给我一个错误:

operator domain: 'Z list list
operand:         real list

谢谢!

【问题讨论】:

  • 问题出在第一个子句last [] = nilnil 不是实数。
  • 非常感谢!
  • @melpomene:你能把它作为答案发布吗?

标签: list sml ml real-number


【解决方案1】:

正如 melpomene 所说,nil 不是 real 类型的值,因此它不能是空列表的返回类型。其实没有值是可以返回的,因为列表是空的!这使得函数 last 部分。你想avoid partial functions,因为它们可能在运行时崩溃。你可以定义一个替代函数,lastOpt:

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

例如,

- lastOpt [1,2,3];
> val it = SOME 3 : int option
- lastOpt [];
> val it = NONE : 'a option

这会将处理空列表的责任明确地交给lastOpt的调用者。

内置函数 List.last 不安全,但有异常:

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

我不建议使用这个。

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 2020-12-23
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2022-06-15
    • 2022-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多