如何检查Haskell中单词的单个字符串?

时间:2016-10-27 12:40:59

标签: haskell

所以我有这个任务,我现在正在努力。我应该编写一个程序来检查两个单词是否具有相同的元音。 这是它的签名:

vowelEq :: String -> String -> Bool

为了做到这一点,我创建了一个名为vowelCheck的函数,它基本上检查Char是否是一个元音并相应地返回一个布尔值。

vowelCheck :: Char -> Bool
vowelCheck v | (v == 'a' || v == 'A') = True
             | (v == 'e' || v == 'E') = True
             | (v == 'i' || v == 'I') = True
             | (v == 'o' || v == 'O') = True
             | (v == 'u' || v == 'U') = True
             | otherwise = False

到目前为止,这就是我所拥有的:

vowelEq :: String -> String -> Bool
vowelEq s1 s2 | vowelCheck(head(s1)) == vowelCheck(head(s2)) = True
              | otherwise = False

它只能检查单词(head s1)的第一个Char是否是元音,是否与另一个单词相同。 现在这是我的问题:我不知道如何检查其余部分。我有想法递归使用尾部,但这不适用于vowelEq的签名(我不允许改变,请注意)。或者只是删除字符串的第一个元素也会有很大帮助。 但到目前为止,我们只学习了如何执行非常基本的功能以及如何声明数据类型,所以不是很多东西。

我是初学者,这是我们上课的第一项任务,所以如果你解释了你的建议和解决方案,我会很感激!

2 个答案:

答案 0 :(得分:1)

您可以使用temp获取字符串的其余部分(可能为空)。

使用它以越来越短的字符串递归调用函数(直到字符串为空)。

  

同一顺序的同一组元音。

这意味着您只需要查看元音:如果字符串以非元音开头,您可以忽略它并继续使用该字符串的tail s1

  

我有想法递归使用尾部,但是不能使用vowelEq的签名

为什么不呢?这两条尾巴仍然是两根弦。

答案 1 :(得分:1)

这样的事情应该有效:

isVowel c= or $ map (c==) ['a','A','e','E','i','I','o','O','U','u']
vowelEq a b = (filter isVowel a) == (filter isVowel b)

并测试:

vowelEq "behind" "rewind"