【问题标题】:SML/NJ string pattern matchingSML/NJ 字符串模式匹配
【发布时间】:2014-09-30 20:50:33
【问题描述】:

在 SML/NJ 中是否有类似列表模式匹配的东西,但对于字符串?我最终想要做的是删除字符串的第一个字符,如果它是一个特定的字符,并且首先想到的是这种解决方案,所以如果我能做到这一点而不进一步弄乱例如,我将不胜感激。通过将字符串转换为列表形式,等等。

【问题讨论】:

    标签: string pattern-matching sml smlnj


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      String.explode 将从字符串中生成一个字符列表。匹配该列表的头部将产生所需的功能:

      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 的正则表达式模式匹配。

      【讨论】:

      • 感谢您的回答。您的解决方案是实用的,但是选择了另一个答案,因为意识到爆炸,我的问题的重点是是否存在字符串模式匹配的直接形式。
      • @NoobDoob 我明白这一点。我的答案是针对所有从谷歌登陆页面的人。他们需要一些实用的东西。对于经常使用它的介绍性课程,SML 文档已经非常不透明(例如,假设具有 C 的工作知识),如果唯一的答案是“否”并说“作为字符串的原因是单态向量。” [不是那是一个实际的报价。]
      猜你喜欢
      • 2018-10-05
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2022-07-06
      相关资源
      最近更新 更多