比较Haskell中的两个字符串

时间:2017-09-20 17:14:38

标签: string function haskell boolean compare

我遇到了一个相当愚蠢的练习问题,被列为简单,所以我想我能做到。前提是医生必须听到患者说aah才能做出诊断,但患者的aah必须符合医生要求的aah。如果医生要求aaaaah并且病人说啊,那么就不能给出诊断。 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”返回True,但“aaah”“ah”返回False。但即使医生在他们的aah中没有包含'h',患者也必须,所以“a”“a”返回False,但我的代码将返回True。因此,如果患者说了什么,那么它必须是'a后面跟一个'h'而不是其他字符的必要数字。你看,一旦我开始尝试建议的测试用例,我意识到我的理解有多少。我可以在每个字符串中保留'a'的计数吗?如何检查额外字符?对不起,这需要一段时间才能阅读。感谢你做到这一点。

这是确切的问题:

  

“当我们去看医生时,医生总是要求我们说”aaah“。   有时,医生需要我们说“aaaaaah”,但我们只能做到   说“aaah”。在那种情况下,医生无法诊断我们的   疾病,因为'a'在我们的“aaah”比他或她少   要求。现在,编写一个名为seeDoctor的Haskell函数来判断   如果医生可以用我们的“aah”来诊断我们。的输入   函数由两个字符串组成。第一个字符串是“aaaah”   医生需要和第二个字符串是我们能够说的“啊”。   如果我们的“aah”符合医生的要求,则输出“True”   否则输出“False”。只有当测试时,测试才能通过“True”   使用小写'a'和'h',每个字符串包含一个   'a'后跟一个'h'的数量。“

1 个答案:

答案 0 :(得分:6)

既然您正在尝试学习Haskell,我不会给您一个解决方案,但我会尝试给您足够的提示,让您自己将功能放在一起。< / p>

字符串是列表,因此您可以使用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'

也许您还想检查流氓字符的输入,如果两个字符串包含除Falsea之外的任何其他字符,则返回h ... < / p>

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

你会对"aha"这样的字符串做些什么呢?我将此作为练习留下:))