Помимо вызова констант 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'
упоминается только один раз.