String SML/NJ字符串模式匹配

String SML/NJ字符串模式匹配,string,pattern-matching,sml,smlnj,String,Pattern Matching,Sml,Smlnj,在SML/NJ中是否有类似于列表模式匹配的东西,但是对于字符串?我最终想做的是删除字符串的第一个字符,如果它是一个特定的字符,我首先想到的是一种解决方案,因此如果我可以在不进一步弄乱的情况下(例如,将字符串转换为列表形式等)删除它,我将不胜感激。不要直接删除。解决此问题的最常见方法是让函数的调用方拆分第一个字符,以便您可以对其进行模式匹配 在SML'97中,字符串是CharVector.vector(具有签名MONO_向量)。SML/NJ确实允许在向量上进行模式匹配(这是一个非标准的扩展),但不

在SML/NJ中是否有类似于列表模式匹配的东西,但是对于字符串?我最终想做的是删除字符串的第一个字符,如果它是一个特定的字符,我首先想到的是一种解决方案,因此如果我可以在不进一步弄乱的情况下(例如,将字符串转换为列表形式等)删除它,我将不胜感激。

不要直接删除。解决此问题的最常见方法是让函数的调用方拆分第一个字符,以便您可以对其进行模式匹配

在SML'97中,字符串是CharVector.vector(具有签名MONO_向量)。SML/NJ确实允许在向量上进行模式匹配(这是一个非标准的扩展),但不幸的是,据我所知,在单态向量上不允许

将从字符串生成字符列表。在该列表的开头进行匹配将产生所需的功能:

fun f s =
   let val c = hd(String.explode s)
   in
    case c
    of #"a" => "The character is a!"
    |  #"b" => "The character is b!"
    |  #"c" => "The character is c!"
    | _     => "Not a b or c!"
   end

字符列表建议使用字符串解析状态机方法,而不是类似Perl的正则表达式模式匹配。

谢谢您的回答。您的解决方案是实用的,但是选择了另一个答案,因为我知道explode,我问题的重点是是否存在字符串模式匹配的直接形式。@NoobDoob我理解这一点。我的答案是支持所有从谷歌登陆页面的人。他们需要一些实用的东西。SML文档对于经常使用它的入门课程来说已经非常不透明(例如,假设有C语言的工作知识),如果唯一的答案是“不”,并且说“字符串是单态向量的原因”,那么互联网对试图学习编程的人来说会更糟。[这不是一个正确的引用。]