【问题标题】:Standard ML: Truncating String标准 ML:截断字符串
【发布时间】:2015-07-28 02:07:20
【问题描述】:

我知道 ML 有一堆字符串方法(子字符串等)可以让这更容易,但我想更熟悉这种语言,所以我自己实现了一些。

我正在尝试截断字符串,即在一定数量的字符后截断字符串。我想我已经很接近了,但是当我这样做时会出现语法错误

val x::xs = explode(myString);

这是完整的代码:

fun getAllButLast([x]) = nil
    | getAllButLast(x::xs) = x::getAllButLast(xs);

fun truncate(myString, 0) = ""
    | truncate(myString, limit:int) =
    let
        val x::xs = explode(myString);
    in
        x::truncate(implode(getAllButLast(xs)), limit - 1)
    end;

为什么编译器不喜欢这样的想法?

val x::xs = explode(myString);

感谢您的帮助, 布莱曼

编辑以包含错误:

Ullman.sml:82.5-82.55 Error: operator and operand don't agree [tycon mismatch]
  operator domain: char * char list
  operand:         char * string
  in expression:
    x :: truncate (implode (getAllButLast <exp>),limit - 1)

uncaught exception Error
  raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:292.17-292.20

【问题讨论】:

  • 你能发布你遇到的错误吗?

标签: functional-programming sml


【解决方案1】:

正如错误消息所示,它抱怨的是不同的行。它之所以抱怨是因为该行中:: 运算符的右操作数(递归调用truncate 的结果)是一个字符串,而不是一个列表。您可能想改用^,它表示字符串连接。

提示:您的代码还有其他问题。至少它是极其低效的。您通常应该避免内爆/爆炸,但如果您必须使用它们,您至少应该为整个字符串调用一次,而不是为递归中的每个字符调用一次。

【讨论】:

  • 似乎代码仍然不喜欢第 80 行:未捕获的异常绑定 [非详尽绑定失败]。知道为什么我不能用 x::xs 分解字符串和模式匹配吗?
  • @bclayman,确保您的字符串 explodeing 不为空。如果是,您将nil 绑定到cons 模式,这会引发异常。
猜你喜欢
  • 2014-04-02
  • 1970-01-01
  • 2014-09-14
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多