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

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);
0
agomez 16 Фев 2020 в 03:02

2 ответа

Лучший ответ

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

1
Venkatesh-Prasad Ranganath 16 Фев 2020 в 00:24

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

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

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

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

Это мой код:

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
0
Simon Shine 16 Фев 2020 в 23:03