char列表上的SML模式匹配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了char列表上的SML模式匹配相关的知识,希望对你有一定的参考价值。
我正在尝试在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
")
| somefunction(_) = print("false
")
如果在字符周围添加括号,问题就会消失:
fun somefunction((#"a")::(#"b")::(#"c")::(#"d")::_::nil) = print("true
")
| somefunction(_) = print("false
")
然后somefunction (explode "abcde")
打印true
和somefunction (explode "abcdef")
打印false
。
我不太清楚为什么SML解析器在解析原始定义时遇到困难。错误消息表明正在将#
解释为应用于字符串的函数。问题不仅仅出现在模式匹配中。 SML也像#"a"::#"b"::[]
这样的表达有困难。起初它似乎是一个优先问题(#
和::
),但这不是问题,因为#"a"::explode "bc"
按预期工作(匹配你观察你的定义如何只有一个#
出现时的工作)。我怀疑这个问题跟踪的事实是用SML 97添加到语言中的字符。早期的SML 90将字符视为长度为1的字符串。也许有一些幕后的kludge与符号#
的方式作为角色文字的一部分被嫁接到语言上。
以上是关于char列表上的SML模式匹配的主要内容,如果未能解决你的问题,请参考以下文章