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