2012-05-01 8 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

(->) rのApplicativeのインスタンスを使用して)

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

も同様に動作し、インポートを避けたい場合は、「何かがrmdupsを含む最後の部分に問題がある」しかし、あなたは私達に教えていないもの(もしあれば)エラーメッセージや出力が得られ、 'rmdups'の定義(あるいは型だけ)は表示されません。私たちはどのように答えなければなりませんか? – delnan

+0

申し訳ありませんが、実際にヌブを意味するときにrmdupsを書きました – user1353742

答えて

0

rmdupsの機能は、nubからData.Listまでです。

10

ため、私はrmdupsがタイプ

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

その後、あなたはそれのためのパラメータが欠落しているを持っていると仮定すると、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)。グループ。 sort' – cdk

+0

@cdk面白いようです。答えにそれを広げることはできませんでしたか? –

4

の使用の代わりにEqOrdを使用する必要がありました。

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)] 

参照のマニュアルをfromListWithおよびtoList

6

要求されたように、ここでControl.Arrowを使用してソリューションです:

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

λl -> (length l, head l) 

-- simplified type signature 
(&&&) :: (a -> b) -> (a -> c) -> a -> (b, c) 
に置き換えることを除いてこれは、 ThePestestの答えと同じ機能です

からControl.Arrow。あなたがそう

+0

誰かが既製のソリューションを探している場合は、['Data.List.Unique']に' count'メソッドがあります(https://hackage.haskell.org/package/Unique-0.4.7.2 /docs/Data-List-Unique.html)。実装は、この回答で与えられたものと非常に似ています。 –

関連する問題