2012-05-01 38 views
8

Tôi mới dùng Haskell và tôi đang cố gắng viết một danh sách để tính toán tần suất của từng giá trị riêng biệt trong danh sách, nhưng tôi đang gặp sự cố phần cuối cùng ..Haskell - Đếm số lần mỗi phần tử khác nhau trong danh sách xảy ra

Cho đến nay tôi có điều này:

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

Cái gì là sai với phần cuối cùng liên quan đến rmdups.

Chức năng đếm mất một nhân vật và sau đó một danh sách các nhân vật và cho bạn biết mức độ thường xuyên nhân vật đó xảy ra, các mã như sau ..

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

Thank-you trước.

+7

Vì vậy, "cái gì là sai với phần liên quan đến rmdups cuối cùng" nhưng bạn không cho chúng tôi biết là sai, những gì (nếu có) thông báo lỗi hoặc đầu ra bạn nhận được, và bạn không hiển thị định nghĩa (hoặc thậm chí chỉ là kiểu) của 'rmdups'. Chúng ta phải trả lời như thế nào? – delnan

+0

Xin lỗi tôi đã viết rmdups trong đó khi tôi thực sự có nghĩa là nub – user1353742

Trả lời

0

Chức năng rmdups của bạn chỉ là nub từ Data.List.

10

tôi đã phải sử dụng Ord trong thay vì Eq vì việc sử dụng sort

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

Sử dụng 'Control.Arrow',' frequency = map (length &&& head). nhóm . sort' – cdk

+0

@cdk Điều đó có vẻ thú vị. Bạn không thể mở rộng khi đó trong một câu trả lời có thể bạn? –

4

Giả sử rmdups có loại

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

Sau đó, bạn đang bỏ lỡ một tham số cho nó.

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

Nhưng lỗi bạn nhận được sẽ hữu ích khi chẩn đoán.

0

Thay thế rmdups bằng nub list làm việc cho tôi như một sự quyến rũ.

10

Bạn cũng có thể sử dụng một mảng kết hợp/đồ hữu hạn để lưu trữ các hiệp hội từ các yếu tố danh sách để đếm của họ trong khi bạn tính toán tần số:

import Data.Map (fromListWith, toList) 

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

Ví dụ sử dụng:

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

Xem tài liệu hướng dẫn của fromListWithtoList.

6

Theo yêu cầu, đây là một giải pháp sử dụng Control.Arrow:

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

Đây là chức năng tương tự như câu trả lời ThePestest 's, trừ

λl -> (length l, head l) 

được thay thế bằng

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

từ Control.Arrow.Nếu bạn muốn tránh việc nhập khẩu,

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

hoạt động như tốt (sử dụng các ví dụ applicative của (->) r)

+0

Trong trường hợp ai đó đang tìm kiếm một giải pháp có sẵn, có phương pháp 'đếm' trong [' Data.List.Unique'] (https://hackage.haskell.org/package/Unique-0.4.7.2 /docs/Data-List-Unique.html). Việc thực hiện khá giống với việc đưa ra trong câu trả lời này. –

Các vấn đề liên quan