Functional programming 标准ML中的递归编译错误

Functional programming 标准ML中的递归编译错误,functional-programming,sml,Functional Programming,Sml,我正在创建一个递归字符串的函数,并替换用户指定字符的每个实例。但是,我得到一个编译错误: Error: operator and operand do not agree [tycon mismatch] operator domain: string * string operand: char * 'Z 我想知道这个错误对我的程序意味着什么,我可能做错了什么。我是SML的新手,一直在努力研究这个问题。谢谢 这是我的代码: fun remCharR(expr, let

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

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

我正在创建一个递归字符串的函数,并替换用户指定字符的每个实例

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

- String.map (fn c => if c = #"l" then #"k" else c) "hello";
> val it = "hekko" : string
由于此函数无法删除字符,这表明“replace”是一个模棱两可的词

我想知道这个错误对我的程序意味着什么,我可能做错了什么

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

这太棒了!但是,我调用此函数时没有打印它有什么原因吗?如果目的是删除
expr
letter
的每个实例,那么您需要累积非
letter
字符,确保
字符串。子字符串(expr,0,1)
确实会导致expr的尾部,并在满足递归的终止/锚定条件时返回累积字符。顺便说一下,您可以考虑使用<代码> FordDr <代码>或<代码> FoLDL<代码>来实现这一点。由于每个
char
对应于结果中的0或1
char
s,这也将符合“concat映射”的功能模式,除了单态(仅用于
string
s中的
char
s)。