标准ML:截断字符串

时间:2015-07-27 14:22:22

标签: functional-programming sml

我知道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);

感谢您的帮助, bclayman

编辑以包含错误:

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

1 个答案:

答案 0 :(得分:2)

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

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