标准 ML 中的递归编译错误

recursion compilation error in Standard ML

我正在制作一个函数,该函数对字符串进行递归并替换用户指定字符的每个实例。但是,我得到一个编译错误:

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);

^ 运算符需要两个 string 操作数,并且 String.sub(expr, 0) ^ remCharR(String.substring(expr, 0, 1), letter) 中的第一个运算符是 char 类型。要修复此错误,请将 String.sub(expr, 0) 更改为 String.substring(expr, 0, 1)

I am making a function that recurses over a string and replaces each instance of a user-specified character.

与此描述对应的函数是String.map。示例:

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

由于此函数不能删除字符,这表明“替换”是一个有歧义的词。

I would like to know what this error means for my program and what I could be doing wrong.

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

Venkatesh-Prasad Ranganath 已经回答了这个问题并展示了如何修复它。

因此,我将展示另一种实现方法。

This is my code:

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