String 比较Haskell中的两个字符串

String 比较Haskell中的两个字符串,string,function,haskell,boolean,compare,String,Function,Haskell,Boolean,Compare,我遇到了一个相当愚蠢的练习题,它被列为简单题,所以我想我可以做。前提是医生必须听到患者说aah才能做出诊断,但患者的aah必须符合医生要求的aah。如果医生要AAAH,而病人说ah,那么就不能做出诊断。Haskell程序应该按照顺序读取医生和患者的aah,并返回Bool值,以确定是否可以进行诊断。起初,我认为它们必须相同,所以这是我的代码: seeDoctor :: String -> String -> Bool seeDoctor a b = if a == b then Tru

我遇到了一个相当愚蠢的练习题,它被列为简单题,所以我想我可以做。前提是医生必须听到患者说aah才能做出诊断,但患者的aah必须符合医生要求的aah。如果医生要AAAH,而病人说ah,那么就不能做出诊断。Haskell程序应该按照顺序读取医生和患者的aah,并返回Bool值,以确定是否可以进行诊断。起初,我认为它们必须相同,所以这是我的代码:

seeDoctor :: String -> String -> Bool
seeDoctor a b = if a == b then True
                else False
然而,我意识到我没有遵循问题的所有规则,而且问题也不是那么简单。患者说aah的时间可能比医生长,并且返回True,因此“aah”“aaah”返回True,就像“aaah”和“h”“aah”一样,但是“aaah”“ah”返回False。但是,即使医生的aah中没有包含“h”,患者也必须这样做,因此“a”“a”返回False,但我的代码将返回True。因此,如果患者说了什么,必须是必要的“a”数,后面跟着一个“h”,而不是其他字符。你看,一旦我开始尝试建议的测试用例,我就意识到我了解的太少了。我可以在每个字符串中记下“a”吗?如何检查额外字符?抱歉,阅读此内容花了一些时间。谢谢你走了这么远

这就是确切的问题:

当我们去看医生时,医生总是让我们说“啊”。 有时,医生需要我们说“aaaaah”,但我们只能说“aaaaah” 说“啊啊”。在这种情况下,医生无法诊断我们的疾病 疾病,因为我们的“啊啊”中的“a”比他或她少 现在,编写一个名为seeDoctor的Haskell函数来判断 如果医生能用我们的“啊”来诊断我们 函数由两个字符串组成。第一个字符串是 医生需要,第二根弦是我们能说的“啊”。 如果我们的“aah”符合医生的要求,则输出“True”,以及 否则输出“False”。只有在以下情况下,测试才应以“True”通过 使用小写字母“a”和“h”,每个字符串包含特定的 后面跟着一个“h”的“a”的数量。”


既然你想学习Haskell,我不会给你一个解决方案,但我会给你足够的提示,让你自己把一个函数组合起来

字符串是列表,因此您可以使用
Data.list
中的常规列表函数。例如,
isSubsequenceOf
几乎可以满足您的需要:

Prelude Data.List> isSubsequenceOf "aah" "aaah"
True
Prelude Data.List> isSubsequenceOf "aaaah" "aah"
False
如果我正确解释了问题描述,您可能还应该检查输入字符串中是否只有
a
h
,并且
h
是最后一个字符

要检查
h
是否为最后一个字符,可以使用
last
功能:

Prelude Data.List> last "aaaah"
'h'
Prelude Data.List> last "ah"
'h'
Prelude Data.List> last "foo"
'o'
也许您还需要检查输入中是否存在恶意字符,如果这两个字符串包含
a
h
以外的任何字符,则返回
False

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

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

你能一字不差地发布请求吗?您描述它的方式不是很清楚。因此,如果我理解正确,两个字符串的格式都是
a*h*
(这是一个正则表达式,
*
表示*前面字符的任何数字),而
a
's和
h
s的数量应该大于或等于请求的aahh?seeDoctor“foo”“aaaaaaah”的输出应该是什么?我认为在这种情况下,@MarkSeemann应该是错误的。你为什么不过滤
'a'
s和
比较它们的长度。。?