【问题标题】:SML Pattern Matching on char lists字符列表上的 SML 模式匹配
【发布时间】:2018-08-13 02:38:22
【问题描述】:

我正在尝试对 SML 中的字符列表进行模式匹配。我将一个从字符串生成的字符列表作为参数传递给辅助函数,但我收到一条错误消息,提示“非构造函数应用于模式中的参数”。如果不是

,错误就会消失
#"a"::#"b"::#"c"::#"d"::_::nil 

我用:

#"a"::_::nil.

任何关于为什么会发生这种情况的解释,如果有的话,将不胜感激。我猜我可以使用 substring 函数来检查原始字符串中的这个特定子字符串,但是我发现模式匹配很有趣并且想试一试。此外,我需要位于字符串后面某处的 char 列表中的特定信息,我想知道我的模式是否可能是:

#"some useless characters"::#"list of characters I want"::#"newline character"

我查看了How to do pattern matching on string in SML?,但没有帮助。

fun somefunction(#"a"::#"b"::#"c"::#"d"::_::nil) = print("true\n")
  | somefunction(_) = print("false\n")

【问题讨论】:

    标签: string pattern-matching sml


    【解决方案1】:

    如果您在字符周围添加括号,问题就会消失:

    fun somefunction((#"a")::(#"b")::(#"c")::(#"d")::_::nil) = print("true\n")
      | somefunction(_) = print("false\n")
    

    然后somefunction (explode "abcde") 打印truesomefunction (explode "abcdef") 打印false

    我不太清楚为什么 SML 解析器难以解析原始定义。错误消息表明正在将 # 解释为应用于字符串的函数。问题不仅仅出现在模式匹配中。 SML 也难以处理像 #"a"::#"b"::[] 这样的表达式。起初,这似乎是一个优先问题(#::),但这不是问题,因为#"a"::explode "bc" 按预期工作(与您对仅出现一个# 时的定义如何工作的观察相匹配)。我怀疑这个问题可以追溯到使用 SML 97 将字符添加到语言中的事实。早期的 SML 90 将字符视为长度为 1 的字符串。也许符号 @ 的方式存在某种幕后混乱。 987654332@作为字符文字的一部分被移植到语言中。

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 2014-09-30
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多