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")打印truesomefunction (explode "abcdef")打印false

我不太清楚为什么SML解析器在解析原始定义时遇到困难。错误消息表明正在将#解释为应用于字符串的函数。问题不仅仅出现在模式匹配中。 SML也像#"a"::#"b"::[]这样的表达有困难。起初它似乎是一个优先问题(#::),但这不是问题,因为#"a"::explode "bc"按预期工作(匹配你观察你的定义如何只有一个#出现时的工作)。我怀疑这个问题跟踪的事实是用SML 97添加到语言中的字符。早期的SML 90将字符视为长度为1的字符串。也许有一些幕后的kludge与符号#的方式作为角色文字的一部分被嫁接到语言上。

以上是关于char列表上的SML模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

SML 模式匹配记录如何工作

Char.toString没有特殊处理“和

SML中来自元组的“Curry”

SML - 使用延续在 trie 中收集单词

给定 SML 中的变量列表,生成所有真值赋值的列表?

SML,如何查找列表中最小数量的出现次数?