【问题标题】:Comparing two strings in Haskell在 Haskell 中比较两个字符串
【发布时间】:2018-03-01 20:55:48
【问题描述】:

我遇到了一个相当愚蠢的练习题,它被列为简单,所以我认为我可以做到。前提是医生必须听到病人说 aah 才能做出诊断,但病人的 aah 必须与医生要求的 aah 相匹配。如果医生问aaaaah,病人说ah,那么就不能给出诊断。 Haskell 程序应该按顺序读取一个医生和一个病人 aah 并返回一个 Bool 值以判断是否可以给出诊断。起初我认为它们需要相同,所以这是我的代码:

seeDoctor :: String -> String -> Bool
seeDoctor a b = if a == b then True
                else False

但是,我意识到我并没有遵循问题的所有规则,而且事情并不是那么简单。患者说 aah 的时间可能比医生长,然后返回 True,因此“aah”“aaaah”返回 True,“”“aaah”和“h”“aah”也是如此,但“aaah”“ah”返回 False。但即使医生没有在他们的 aah 中包含“h”,患者也必须,所以“a”“a”返回 False,但我的代码将返回 True。因此,如果患者说什么,则必须是必要数量的“a”后跟一个“h”,并且没有其他字符。你看,一旦我开始尝试建议的测试用例,我就意识到我理解的太少了。我可以在每个字符串中保留“a”的计数吗?如何检查多余的字符?抱歉,这花了一些时间来阅读。感谢您到此为止。

这是确切的问题:

“当我们去看医生时,医生总是让我们说“啊啊”。 有时候,医生要我们说“啊啊啊”,但我们只能说 说“啊”。在这种情况下,医生无法诊断出我们的 疾病,因为我们的“aaah”中的“a”比他或她的少 要求。现在,写一个叫做seeDoctor的Haskell函数来判断 如果医生可以用我们的“啊”来诊断我们。的输入 函数由两个字符串组成。第一个字符串是“aaaah” 医生需要,第二个字符串是我们可以说的“啊”。 如果我们的“aah”符合医生的要求,则输出“True”,并且 否则输出“假”。只有在 使用小写的'a's和'h's,每个字符串包含一定的 'a' 的数量后跟一个 'h'。"

【问题讨论】:

  • 您可以逐字发布请求吗?你描述的方式,不是很清楚。
  • 所以如果我理解正确的话,两个字符串的格式都是a*h*(这是一个正则表达式,* 表示*前一个字符的任意数量),以及a' 的数量s 和hs 应该大于或等于请求的 aahh?
  • seeDoctor "foo" "aaaaaaaah" 的输出应该是什么?
  • 我认为在这种情况下应该是 False,@MarkSeemann。
  • 你为什么不过滤'a's和compare他们的长度..?

标签: string function haskell boolean compare


【解决方案1】:

既然你正在尝试学习 Haskell,我不会给你一个解决方案,但我会尽量给你足够的提示,让你自己组合一个函数。

字符串是列表,因此您可以使用Data.List 中的普通列表函数。例如,isSubsequenceOf 几乎可以满足您的需求:

Prelude Data.List> isSubsequenceOf "aah" "aaah"
True
Prelude Data.List> isSubsequenceOf "aaaah" "aah"
False

如果我正确解释了问题描述,您可能还应该检查输入字符串中是否只有ah,并且h 是最后一个字符。

为了检查h 是否是最后一个字符,您可以使用last 函数:

Prelude Data.List> last "aaaah"
'h'
Prelude Data.List> last "ah"
'h'
Prelude Data.List> last "foo"
'o'

也许您还想检查输入是否有恶意字符,如果两个字符串包含除ah 之外的任何其他字符,则返回False...

Prelude Data.List> all (\c -> c == 'a' || c == 'h') "aaah"
True
Prelude Data.List> all (\c -> c == 'a' || c == 'h') "aaah!"
False

但是,对于像 "aha" 这样的字符串,你会怎么做呢?我会把它留作练习:)

【讨论】:

    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多