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或1char
s,这也将符合“concat映射”的功能模式,除了单态(仅用于string
s中的char
s)。