【问题标题】:delete white spaces from char list - sml从字符列表中删除空格 - sml
【发布时间】:2015-11-05 19:25:55
【问题描述】:

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

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

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 或者如果这是不可能的,那么如何从字符串中删除空格?

【问题讨论】:

  • 返回[] 不要空举。您的基本案例引发了错误 - 您预期会发生什么?
  • @JohnColeman 我将其更改为 nil 并且有效。多谢。 P.S 我只是想从列表中删除空入口

标签: sml smlnj


【解决方案1】:

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

作为一般经验法则,如果您要定义一个将列表发送到列表的函数,并且输出列表是通过逐一处理输入列表的元素来构造的(例如,返回 int 列表中偶数元素的列表,这涉及依次检查每个元素的奇偶性),那么您的基本情况应该类似于fun f [] = [],因为空输入对应于没有要处理的内容,如果没有要处理的内容,则没有任何内容要返回。

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2011-04-20
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多