2012-02-14 34 views
1

我想在一个句子中计算元音组。我如何计算使用Haskell的一个句子中的元音组

我的第一次尝试是使用列表理解来将句子减少为每个Char的布尔值列表,具体取决于它是否是元音。但是,我不确定如何统计列表中连续“真”值的组。有没有这样做的伎俩?

它位于我的教科书中关于列表和列表理解的章节中,所以我觉得它与此有关。

回答

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 s,现在你想要统计“全部为真”的组。

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

任何这两个家伙都应该证明是有用的,因为既可以减少全等于布尔值的列表为等于给他们一个值。 (编辑:正如在评论中提到的,我在这里过度工作,你只需要采取每个“组”的head。事实上,你也可以通过查看第一组是否为元音/辅音,并通过计算组的数量,因为肯定有一个交替元音/辅音!)

而现在,你只需要在这最后的名单来算True S,因为每个True代表一组元音!

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

你应该能够自己做这些管道的这些迹象!

+1

删除了我的答案,因为我无法想清楚。但是你不必使用'和'或'or'; '头'更好! – dflemstr 2012-02-14 23:58:15

+0

@dflemstr哦对!猜测我没有想到懒得够^^' – Ptival 2012-02-15 00:00:34

+0

谢谢。小组的功能是我真正想要的。将尝试自行解决剩下的问题! – Ben313 2012-02-15 00:13:38

2

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

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

这样,您可以分割字符串转换成连续的元音和非元音组。据我所知,只有列表理解没有简单的方法。

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函数来执行此操作。

+0

这很整齐。 – Ptival 2012-02-15 06:40:57