我正在编写我正在编写的函数的基本情况。我有一个我声明的数据类型。在基本情况下,我需要用一些东西替换零。我如何告诉它该函数不会返回任何内容?
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))
编辑:我不允许更改数据类型。
答案 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
老实说,与添加新的值构造函数相比,这些解决方案非常糟糕。