ошибка компиляции рекурсии в Standard ML - PullRequest
0 голосов
/ 16 февраля 2020

Я делаю функцию, которая рекурсивно перебирает строку и заменяет каждый экземпляр пользовательского символа. Однако я получаю ошибку компиляции:

Error: operator and operand do not agree [tycon mismatch]
  operator domain: string * string
  operand:         char * 'Z

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

Это мой код:

fun remCharR(expr, letter) = 
    if String.sub(expr, 0) = letter 
    then remCharR(String.substring(expr, 0, 1), letter)
    else String.sub(expr, 0) ^ remCharR(String.substring(expr, 0, 1), letter);

Ответы [ 2 ]

1 голос
/ 16 февраля 2020
Оператору

^ нужны два операнда string, а первый оператор в String.sub(expr, 0) ^ remCharR(String.substring(expr, 0, 1), letter) имеет тип char. Чтобы исправить эту ошибку, измените String.sub(expr, 0) на String.substring(expr, 0, 1).

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

Я делаю функцию, которая повторяется по строке и заменяет каждый экземпляр пользовательского символа.

Функция, которая соответствует этому описанию, String.map. Пример:

- String.map (fn c => if c = #"l" then #"k" else c) "hello";
> val it = "hekko" : string

Поскольку эта функция не может удалять символы, это говорит о том, что «заменить» является неоднозначным словом.

Я хотел бы знать, что означает эта ошибка для моя программа и что я могу делать неправильно.

Error: operator and operand do not agree [tycon mismatch]
operator domain: string * string
operand:         char * 'Z

Venkate sh - Прасад Ранганатх уже ответил на это и показал, как это исправить.

Поэтому вместо этого я покажу альтернативный способ реализовать это.

Это мой код:

fun remCharR(expr, letter) = 
   if String.sub(expr, 0) = letter 
   then remCharR(String.substring(expr, 0, 1), letter)
   else String.sub(expr, 0) ^ remCharR(String.substring(expr, 0, 1), letter);

Поскольку единственной задачей этой функции является удаление символов, используйте String.translate:

fun remChar (c1, s) =
    String.translate (fn c2 => if c1 = c2 then "" else str c2) s
...