【问题标题】:recursion compilation error in Standard ML标准 ML 中的递归编译错误
【发布时间】:2020-05-31 07:32:33
【问题描述】:

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

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

【问题讨论】:

    标签: functional-programming sml


    【解决方案1】:

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

    【讨论】:

    • 这太棒了!但是,当我调用它时,这个函数没有打印是有原因的吗?
    • 如果打算删除exprletter 的每个实例,那么您需要累积非letter 字符,确保String.substring(expr, 0, 1) 确实导致尾部- expr 的一部分,并在满足递归的终止/锚定条件时返回累积的字符。顺便说一句,您可以考虑使用 foldrfoldl 来完成此操作 -- en.wikipedia.org/wiki/Fold_%28higher-order_function%29
    • String.translate。由于每个char 对应于结果中的 0 或 1 个chars,这也适合“concat-map”的功能模式,除了单态(仅与 strings 中的 chars 相关) .
    【解决方案2】:

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

    与此描述对应的函数是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
    

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

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

    这是我的代码:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多