«Ошибка: несвязанная переменная или конструктор: False» - PullRequest
0 голосов
/ 17 октября 2019

Я проверяю, является ли список палиндромом, поэтому я создал функцию с именем 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 Ответ

1 голос
/ 21 октября 2019

Помимо вызова констант 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: в Прологе и Эрланге, но не в SML. Если вы должны использовать case-of , как это, вот что вы можете сделать (снова используя встроенную функцию List.rev):

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

, хотя это так же, какнет необходимости, поскольку xs' упоминается только один раз.

...