我正在测试列表是否是回文,因此我创建了一个名为reverse
的函数,该函数可以反转列表,而我创建的名为palindrome
的函数使用模式匹配来尝试查看列表是否匹配反向列表。但是我遇到unbound variable or constructor
错误。
(* This function returns true for all patterns that match itself in reverse as well as for the empty list
Otherwise _ wildcard character we return False *)
fun palindrome (xs): bool =
let val rev = reverse(xs)
in
case xs of
rev => True
| [] => True
| _ => False
end;
输出:
Error: unbound variable or constructor: False
vaje1.sml:125.10-125.14 Error: unbound variable or constructor: True
vaje1.sml:123.9-123.13 Error: unbound variable or constructor: True
答案 0 :(得分:1)
除了正确调用常量true
和false
之外,另一个错误在于如何比较两个列表是否相等。正如molbdnilo指出的那样,最简单的方法是one = other
,即(使用内置的List.rev
函数):
fun palindrome xs =
xs = List.rev xs
之所以起作用,是因为,如果您具有一个相等的可比值,则这些值的列表会自动产生相等的可比值。如果不是这种情况,则可以通过以下方式递归定义此类函数:
fun list_eq ([], []) = true
| list_eq (x::xs, y::ys) = (x = y) andalso list_eq (xs, ys)
| list_eq (_, _) = false (* lists of mismatching length *)
(* one way *)
fun palindrome xs =
list_eq (xs, List.rev xs)
但是内置的=
已经做到了。
您使用 case-of 的方式似乎是尝试通过使用两个字符来比较两个变量xs
和rev
(不是函数)是否相等。模式rev
,希望这样的模式引用变量rev
:它将在Prolog和Erlang中出现,但在SML中不会出现。如果必须像这样使用 -case ,则可以执行以下操作(再次使用内置的List.rev
函数):
fun palindrome xs =
case List.rev xs of
xs' => (xs = xs')
尽管这是不必要的,因为xs'
仅被引用一次。