char列表上的SML模式匹配

时间:2018-03-05 12:25:26

标签: string pattern-matching sml

我试图在SML中对char列表进行模式匹配。我将一个字符串生成的字符列表作为参数传递给辅助函数,但是我得到一个错误说"非构造函数应用于模式"中的参数。如果不是

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

我用:

#"a"::_::nil.

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

#"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")

1 个答案:

答案 0 :(得分:2)

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

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的字符串。也许有一些幕后的符号与符号的方式{ {1}}作为角色文字的一部分被嫁接到语言上。