2012-05-01 95 views
8

我是Haskell的新手,我只是想写一个列表理解来计算列表中每个不同值的频率,但是我遇到了问题最后一部分..Haskell - 计算列表中每个不同元素的出现次数

到目前为止,我有这样的:

frequency :: Eq a => [a] -> [(Int,a)] 
frequency list = [(count y list,y) | y <- rmdups ] 

某处有问题,涉及rmdups的最后一部分。

count函数需要一个字符,然后字符列表,告诉你如何字符经常发生,代码如下..

count :: Eq a => a -> [a] -> Int 
count x [] = 0 
count x (y:ys) | x==y = 1+(count x ys) 
       | otherwise = count x ys 

感谢你提前。

+7

所以,“什么是错与去年涉及rmdups的一部分”,但你不告诉我们什么是错误的,你得到的错误信息或输出是什么(如果有的话),并且你不显示'rmdups'的定义(甚至只是类型)。我们应该如何回答? – delnan

+0

对不起,我写了rmdups在那里,当我的意思是nub – user1353742

回答

0

您的rmdups功能只是nubData.List

10

我不得不代替Eq使用Ord因为使用sort

frequency :: Ord a => [a] -> [(Int,a)] 
frequency list = map (\l -> (length l, head l)) (group (sort list)) 
+4

使用'Control.Arrow','frequency = map(length &&& head)。组。排序' – cdk

+0

@cdk这似乎很有趣。你不能在这个问题上扩大你的答案吗? –

4

假设rmdups有那么你就错过了它的参数类型

rmdups :: Eq a => [a] -> [a] 

frequency :: Eq a => [a] -> [(Int,a)] 
frequency list = [(count y list,y) | y <- rmdups list] 

但是,您得到的错误将有助于诊断。

0

替换rmdupsnub list为我工作就像一个魅力。

10

你也可以使用一个关联数组/有限地图存储从列表元素的计数的关联,而你计算频率:

import Data.Map (fromListWith, toList) 

frequency :: (Ord a) => [a] -> [(a, Int)] 
frequency xs = toList (fromListWith (+) [(x, 1) | x <- xs]) 

实例:中

> frequency "hello world" 
[(' ',1),('d',1),('e',1),('h',1),('l',3),('o',2),('r',1),('w',1)] 

查看文档fromListWithtoList

6

按照要求,这里是一个使用Control.Arrow一个解决方案:

frequency :: Ord a => [a] -> [(Int,a)] 
frequency = map (length &&& head) . group . sort 

这是相同的功能,ThePestest的回答,除了

λl -> (length l, head l) 

被替换

-- simplified type signature 
(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c) 

Control.Arrow。如果你想避免进口,

liftA2 (,) :: Applicative f => f a -> f b -> f (a, b) 

作品,以及(使用(->) r应用型实例)

+0

如果有人正在寻找现成解决方案,['Data.List.Unique']中有一个'count'方法(https://hackage.haskell.org/package/Unique-0.4.7.2 /docs/Data-List-Unique.html)。该实现与此答案中的实现非常相似。 –

相关问题