【问题标题】:SML Contains using a String and CharlistSML 包含使用字符串和字符列表
【发布时间】:2017-07-04 16:43:08
【问题描述】:

我正在尝试将字符串与 SML 中的字符列表进行比较,使用 REPL 我有这个:

val alphabet = "abcdefghijklmnopqrstuvwxyz";
val charalphabet = explode alphabet;
val str = "the quick brown fox";
val res = Char.contains(str, charalphabet);

这会引发错误,因为我正在尝试将字符串与 Charlist 进行比较,并且 contains 仅将字符串与单个 Char 进行比较。有谁知道如何解决这个问题?我可以分解 String str 并比较 Char 列表,但是我不确定它们是否是一个函数。因此,如果有人对我可以阅读的函数或内容有任何想法,请告诉我,目标是查看字符串是否包含每个定义的字符列表。

我对 SML 非常陌生,因此非常感谢任何帮助!

【问题讨论】:

  • 您的字母表中缺少wxyz 有什么原因吗?无论如何:提示 1:List.all 很有用。提示 2:Char.contains strchar -> bool 类型的函数。
  • 我编辑了帖子,缺少的“wxyz”是我的错字。我将研究你刚才提到的两件事。我今天早些时候的函数是: fun isPangram c = if Char.contains(c, charalphabet) then true else false;即使它不工作,是否在正确的轨道上?
  • 是的,从某种意义上说,Char.contains 是该工作的自然工具,并且您知道当前代码存在什么问题,因此它走在了正确的轨道上。但请注意,Char.contains 是一个柯里化函数,因此像这样在输入周围加上括号是不正确的,因此除了 char 与 char 列表问题之外,您还有另一个问题。
  • 我认为放括号是无关紧要的,是出于审美目的,但我想我错了。那么是否可以定义我自己的 contains 函数来检查字符串是否包含字母表中的所有字符,如果包含则返回 true?
  • 是的,你可以定义你想要的,但是有一个使用 List.all 和 Char.contains 的 1 行定义。

标签: string function contains sml string-comparison


【解决方案1】:

您在Char.contains 的参数之间加上括号和逗号的方式表明您在理解Char.contains 之类的函数如何工作时遇到了一些困难。此类函数称为柯里化函数,如果您将它们视为两个变量的函数,会有些误导。

Char.contains 是string -> char -> bool 类型的函数。输入类型是字符串,输出类型是char -> bool 类型的函数。通常会立即评估此输出函数:

- Char.contains "cat" #"a";
val it = true : bool

看起来您正在评估 2 个变量的函数,但实际上您正在评估 1 个变量的 2 个函数:函数 Char.contains"cat" 被评估以返回类型为 char -> bool 的函数后一个函数在#"a" 进行评估以获得最终结果。

请注意,可以使用Char.contains 返回一个没有立即评估的函数。例如:

val isVowel = Char.contains "aeiou";

这里isVowel是一个函数,可以用来检查一个(小写)字符是否是元音。

List.all('a -> bool) -> 'a list -> bool 类型的函数。要使用它来检查给定类型的列表(例如char)是否满足某个属性的所有元素,您需要向它传递一个函数,该函数接受该类型的元素并返回一个布尔值(例如@类型的函数987654336@;

但是——我们已经知道如何制造char -> bool 类型的函数:使用Char.contains。对于任何字符串 sChar.contains s 是一个可以传递给 List.all 的函数,然后将生成的函数应用于字母表中的字符列表:

val alphabet = explode "abcdefghijklmnopqrstuvwxyz";
fun isPanagram s = List.all (Char.contains s) alphabet;

Char.contains s 括在括号中的原因是因为函数求值是左关联的。如果没有括号,SML 会将其解析为 (List.all Char.contains) s,这毫无意义。

【讨论】:

  • 非常感谢您的深入回复/解释。通过您推荐的一些更改,我的功能可以完美运行。再次感谢您坚持我并花时间解释一切!
猜你喜欢
  • 1970-01-01
  • 2021-02-27
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2014-12-10
  • 2017-10-10
  • 2021-08-12
相关资源
最近更新 更多