SML - 基本情况,声明的数据类型的错误返回值

时间:2013-07-11 14:38:44

标签: pattern-matching sml smlnj type-mismatch

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

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))

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

1 个答案:

答案 0 :(得分: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 = ...

如果您不想更改数据类型,则无法终止列表。它将永远继续下去,因为你唯一可以拥有的是Cons,它代表另一个元素。

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

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

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

exception EndOfNewThing

fun permutation [] = raise EndOfNewThing

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