标准 ML:截断字符串
Standard ML: Truncating String
我知道 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
如错误消息所示,它正在抱怨另一条线路。它在抱怨,因为该行中 ::
运算符的右操作数(对 truncate
的递归调用的结果)是一个字符串,而不是一个列表。您可能想改用 ^
,它表示字符串连接。
提示:您的代码还有其他问题。至少它是极其低效的。通常应避免使用 implode/explode,但如果必须使用它们,则至少应为整个字符串分别调用一次,而不是为递归中的每个字符调用一次。
我知道 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
如错误消息所示,它正在抱怨另一条线路。它在抱怨,因为该行中 ::
运算符的右操作数(对 truncate
的递归调用的结果)是一个字符串,而不是一个列表。您可能想改用 ^
,它表示字符串连接。
提示:您的代码还有其他问题。至少它是极其低效的。通常应避免使用 implode/explode,但如果必须使用它们,则至少应为整个字符串分别调用一次,而不是为递归中的每个字符调用一次。