如何使用Haskell计算句子中的元音组

时间:2012-02-14 23:34:05

标签: haskell

我试图用一个句子来计算元音组。

我的第一次尝试是使用列表理解将句子缩减为每个Char的布尔值列表,具体取决于它是否是元音。但是,我不确定如何计算列表中连续“True”值的组。这有什么诀窍吗?

它位于我的教科书的一章中,处理列表和列表理解,因此我觉得它与此有关。

3 个答案:

答案 0 :(得分:5)

由于我不知道这是否是作业,我会给你提示:

在Data.List中:

group :: Eq a => [a] -> [[a]]
-- also interesting: groupBy :: (a -> a -> Bool) -> [a] -> [[a]]

-- for example:
-- group [True, True, False, False, False, True] =
-- [[True, True], [False, False, False], [True]]

你可以写自己的:

isVowel :: Char -> Bool

因此,您应该能够使用Bool来获取您提及的列表,现在您想要计算“全部为真”的组。

and :: [Bool] -> Bool
or :: [Bool] -> Bool

这两个研究员中的任何一个都应该证明是有用的,因为两者都可以将所有相等的布尔值列表减少为等于它们的单个值。 (编辑:正如评论中所提到的,我在这里过度工作,你只需要拿走每个“组”的head。实际上,你也可以通过查看元组的数量来猜测元音组的数量。第一组是元音/辅音,通过计算组的数量,因为肯定有一个替代元音/辅音!)

现在,您只需计算最终列表中的True,因为每个True代表一组元音!

filter :: (a -> Bool) -> [a] -> [a]
length :: [a] -> Int

你应该能够自己做这些适应症的管道工作!

答案 1 :(得分:4)

请注意,您可以通过查看相邻字符对来计算元音组。每当你有一个辅音后跟一个元音时,你就会找到一个元音组的开头。例外情况是字符串以元音开头,但可以通过在前面添加虚拟辅音来修复。

要查看相邻的对,您可以使用通过其尾部压缩列表的常用技巧,因此您可以获得这样的对:

> let xs = "upheaval"
> zip ('x':xs) xs
[('x','u'),('u','p'),('p','h'),('h','e'),('e','a'),('a','v'),('v','a'),('a','l')]

现在你需要做的就是计算第一个字母是辅音的对数,第二个是元音。例如,您可以使用列表推导或filter以及length函数来执行此操作。

答案 2 :(得分:2)

Data.List模块提供了方便的groupBy功能

groupBy :: (a -> a -> Bool) -> [a] -> [[a]]

通过它,您可以将字符串拆分为连续元音和非元音的组。据我所知,没有简单的方法只使用列表推导。