从字符列表中删除空格 - 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 值上进行模式匹配(使用两个模式 NONE
和 SOME x
),而不是提供异常处理程序。从概念上讲,第二种方法更简洁,甚至可能更高效(它似乎在 F# 中,请参阅 this,我不确定 SML)。
有关 SML 中两种错误处理方法的讨论,请参阅 this。
我正在尝试从 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 值上进行模式匹配(使用两个模式 NONE
和 SOME x
),而不是提供异常处理程序。从概念上讲,第二种方法更简洁,甚至可能更高效(它似乎在 F# 中,请参阅 this,我不确定 SML)。
有关 SML 中两种错误处理方法的讨论,请参阅 this。