我试图在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")
答案 0 :(得分:2)
如果在字符周围添加括号,则问题就会消失:
fun somefunction((#"a")::(#"b")::(#"c")::(#"d")::_::nil) = print("true\n")
| somefunction(_) = print("false\n")
然后somefunction (explode "abcde")
打印true
,somefunction (explode "abcdef")
打印false
。
我不太确定为什么SML解析器在解析原始定义时遇到困难。错误消息表明正在将#
解释为应用于字符串的函数。问题不仅仅出现在模式匹配中。 SML也很难使用像#"a"::#"b"::[]
这样的表达式。起初它似乎是一个优先问题(#
和::
),但这不是问题,因为#"a"::explode "bc"
按预期工作(匹配您对定义如何工作时的观察#
出现了)。我怀疑这个问题跟踪的事实是用SML 97添加到语言中的字符。早期的SML 90将字符视为长度为1的字符串。也许有一些幕后的符号与符号的方式{ {1}}作为角色文字的一部分被嫁接到语言上。