0

我在编写函数的基本情况时遇到问题。我有一个我已经声明的数据类型。在基本情况下,我需要用一些东西替换 nil 。我如何告诉它该函数不会返回任何内容?

datatype 'a newThing = Cons of 'a option * (unit -> 'a newThing);

fun permutation [] = Cons(NONE, fn () => nil)
|   permutation l = .....;


Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z option * (unit -> 'Z newThing)
operand:         'Z option * (unit -> 'Y list)
in expression:
Cons (NONE,(fn () => nil))

编辑:我不允许更改数据类型。

4

1 回答 1

2

您的数据类型只有Cons值构造函数(表示另一个元素),但您需要一个Nil构造函数(表示没有其他元素)。

然后类型检查器会给你一个类型错误,因为你试图返回一个类型nil'a list而不是'a newThing.

您要做的是Nil向您的数据类型添加一个构造函数'a newThing,并在基本情况下返回此值。

datatype 'a newThing = Cons of 'a option * (unit -> 'a newThing)
                     | Nil

fun permutation [] = Nil
  | permutation l = ...

如果您不更改数据类型,则无法终止列表。它会一直持续下去,因为你唯一能拥有的是 a Cons,它代表另一个元素。

NONE假设您要表示的列表中没有元素,您可以让 的值NONE表示列表的结尾,并且NONE一旦用完元素就无限地返回。

fun permutation [] = Cons(NONE, permutation [])

如果您愿意,也可以抛出异常:

exception EndOfNewThing

fun permutation [] = raise EndOfNewThing

不过老实说,与添加新的值构造函数相比,这些解决方案相当糟糕。

于 2013-07-11T15:10:07.143 回答