从char列表删除空格 - sml

问题描述:

我想从sml中的char列表中删除空条目。从char列表删除空格 - 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或者,如果这是不可能的,那我怎么才能从一个字符串删除空白空间?

+1

返回'[]'不要空虚。你是基础案例引发了一个错误 - 你期望发生什么? –

+0

@JohnColeman我改变它为零,它的工作。非常感谢。 P.S我只是想从列表中删除空的入口 – zeeks

我怀疑raise 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来解决。

由于SML提供了一种使用option类型构造函数的替代错误处理方法,因此可以不要使用raise Empty。该功能可以firstEven在这种情况下,调用函数将在返回值模式匹配(采用两种模式NONESOME x),而不是提供一个异常处理程序被重写

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

。从概念上讲,这第二种方法更清洁,甚至更有效(似乎在F#中,见this,我不确定SML)。

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