“错误:未绑定变量或构造函数:False”

时间:2019-10-17 09:09:47

标签: list function sml

我正在测试列表是否是回文,因此我创建了一个名为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

1 个答案:

答案 0 :(得分:1)

除了正确调用常量truefalse之外,另一个错误在于如何比较两个列表是否相等。正如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 的方式似乎是尝试通过使用两个字符来比较两个变量xsrev(不是函数)是否相等。模式rev,希望这样的模式引用变量rev:它将在Prolog和Erlang中出现,但在SML中不会出现。如果必须像这样使用 -case ,则可以执行以下操作(再次使用内置的List.rev函数):

fun palindrome xs =
  case List.rev xs of
    xs' => (xs = xs')

尽管这是不必要的,因为xs'仅被引用一次。