char列表上的SML模式匹配

问题描述 投票:0回答:1

我正在尝试在SML中对char列表进行模式匹配。我将从字符串生成的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")
string pattern-matching sml
1个回答
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的字符串。也许有一些幕后的kludge与符号#的方式作为角色文字的一部分被嫁接到语言上。

© www.soinside.com 2019 - 2024. All rights reserved.