2012-05-01 118 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)。該實現與此答案中的實現非常相似。 –

相關問題