SMLcircularity Ошибка операнда и оператора не согласны - PullRequest
0 голосов
/ 27 января 2020
    fun insert R x [] acc = [x]
  | insert R x (h::t) acc =
    if R (x,h) then acc::(x::(h::t))
    else(
        acc=acc::h;
        insert R x t acc
        );
fun isort_aux R [] acc = acc
  | isort_aux R (x::xs) acc =
    isort_aux xs (insert R x acc [])
fun isort_2 R xs = isort_aux R xs []

Я пытаюсь написать хвостовой рекурсивный код для вставки сортировки в sml, для которого я сделал аккумулятор 'a cc', но в строке 5 acc = a cc :: h выдает следующую ошибку

Standard ML of New Jersey v110.78 [built: Thu Aug 31 03:45:42 2017]
- stdIn:5.3-5.13 Error: operator and operand don't agree [circularity]
  operator domain: 'Z * 'Z list
  operand:         'Z * 'Z
  in expression:
    acc :: h
- 

1 Ответ

0 голосов
/ 09 февраля 2020

acc = a cc :: h; insert R xta cc

Наличие двух вызовов здесь не работает в SML. Вы можете сделать только одну вещь в SML из-за структуры языка. Я сделал это, когда начал работать над SML несколько недель go, и у меня это не сработало.

Как говорится в комментарии @moldbnilo, ваш код пытается сравнить cc с cc :: h и не устанавливая его равным cc.

Я очень плохо знаком с SML, поэтому возьмите это с крошкой соли, поскольку это может быть неправильно.

...