从字符列表中删除空格 - sml

delete white spaces from char list - sml

我正在尝试从 sml 中的字符列表中删除空条目。

这是我的函数,但当我尝试调用它时,它不起作用并引发了致命错误。

fun no_spaces([]) = raise Empty
  | no_spaces(e::f) = if(e = #" ") then no_spaces(f) else e::no_spaces(f);

no_spaces [#"a",#"a",#" ",#"d",#" "];

我做错了什么?

谢谢

P.S 或者,如果这不可能,那么如何从字符串中删除空格?

我怀疑 raise Empty 的意思是 到 return 空列表而不是触发运行时错误。您已经在评论中指出您已经修复了那个特定的错误,但是多说一点关于什么时候应该 return nil 以及什么时候应该 raise empty 也没什么坏处。

作为一般经验法则,如果您正在定义一个将列表发送到列表的函数,并且输出列表是通过一个接一个地处理输入列表的元素构建的(例如 return即使是 int 列表中的元素,这涉及依次检查每个元素的奇偶校验)那么你的基本情况应该类似于 fun f [] = [] 因为空输入对应于没有任何东西需要处理,如果没有任何东西需要处理那么 return.

就没什么了

但是——如果列表函数的目标是return列表的元素(例如第一个偶数条目)那么它很自然到 raise Empty:

fun firstEven [] = raise Empty
|   firstEven (x::xs) = if x mod 2 = 0 then x else firstEven xs; 

此处 raise Empty 完美:由于 [] 不包含任何整数,因此它不包含 return 的第一个偶数。因此,这是一种错误情况,(理想情况下)应该在调用函数的某处使用 handle 来解决。

可以提出一个论点,即永远不应使用 raise Empty,因为 SML 提供了一种使用 option 类型构造函数的替代错误处理方法。函数 firstEven 可以重写

fun firstEven [] = NONE
|   firstEven (x::xs) = if x mod 2 = 0 then SOME x else firstEven xs;

在这种情况下,调用函数将在 returned 值上进行模式匹配(使用两个模式 NONESOME x),而不是提供异常处理程序。从概念上讲,第二种方法更简洁,甚至可能更高效(它似乎在 F# 中,请参阅 this,我不确定 SML)。

有关 SML 中两种错误处理方法的讨论,请参阅 this