我想在一个句子中计算元音组。我如何计算使用Haskell的一个句子中的元音组
我的第一次尝试是使用列表理解来将句子减少为每个Char的布尔值列表,具体取决于它是否是元音。但是,我不确定如何统计列表中连续“真”值的组。有没有这样做的伎俩?
它位于我的教科书中关于列表和列表理解的章节中,所以我觉得它与此有关。
我想在一个句子中计算元音组。我如何计算使用Haskell的一个句子中的元音组
我的第一次尝试是使用列表理解来将句子减少为每个Char的布尔值列表,具体取决于它是否是元音。但是,我不确定如何统计列表中连续“真”值的组。有没有这样做的伎俩?
它位于我的教科书中关于列表和列表理解的章节中,所以我觉得它与此有关。
因为我不知道它是否是一个功课做,我去给你提示:
在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
你应该能够自己做这些管道的这些迹象!
的Data.List
模块提供了方便groupBy
功能,
groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
这样,您可以分割字符串转换成连续的元音和非元音组。据我所知,只有列表理解没有简单的方法。
请注意,您可以通过查看相邻字符对来计算元音组。每当你有一个辅音后跟一个元音,你就找到了一个元音组的开始。例外情况是字符串以元音开头,但可以通过在前面添加虚拟辅音来解决。
来看看相邻的一对,你可以使用压缩和解与它的尾巴列表的常用的伎俩,这样你就可以得到对这样的:
> 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
函数来执行此操作。
这很整齐。 – Ptival 2012-02-15 06:40:57
删除了我的答案,因为我无法想清楚。但是你不必使用'和'或'or'; '头'更好! – dflemstr 2012-02-14 23:58:15
@dflemstr哦对!猜测我没有想到懒得够^^' – Ptival 2012-02-15 00:00:34
谢谢。小组的功能是我真正想要的。将尝试自行解决剩下的问题! – Ben313 2012-02-15 00:13:38