2012-03-11 33 views
12

Tôi có ba từ trong danh sách ["a", "b", "c"]. tôi muốn tìm tất cả sự kết hợp có thể có trong thiết 5,6, vvKết hợp Haskell và hoán vị

ví dụ cho bộ 5 tôi sẽ phải

**[ [aaaaa],[aaaab],[aaaac], [aaabc] , ..... ]** etc 3^5 = 243 combinations 

aaaaaa trên về cơ bản sẽ là "a", "a", "a" , "a", "a" ....

+0

tôi đang làm việc này từ hôm qua. không đi xa hơn nữa. nếu tôi có thể nhận được một số ý tưởng thì tôi có thể làm được. – Waqas

+2

@ user1115751: Để bắt đầu, hãy tìm kiếm "[haskell cartesian product] (http://stackoverflow.com/search?q=haskell+cartesian+product&submit=search)". – kennytm

Trả lời

20

replicateM làm những gì bạn muốn:

> import Control.Monad 
> replicateM 5 ["a", "b", "c"] 
[["a","a","a","a","a"],["a","a","a","a","b"],["a","a","a","a","c"],["a","a","a","b","a"],["a","a","a","b","b"],["a","a","a","b","c"],["a","a","a","c","a"],["a","a","a","c","b"],["a","a","a","c","c"],["a","a","b","a","a"],["a","a","b","a","b"],["a","a","b","a","c"],["a","a","b","b","a"],["a","a","b","b","b"],["a","a","b","b","c"]...] 
20

Tất nhiên, câu trả lời của nanothief cung cấp cho các giải pháp ngắn nhất, nhưng nó có thể là bài học và thú vị để làm điều đó cho mình .

Có nhiều cách để viết chức năng cho sản phẩm Descartes. Ví dụ. bạn có thể sử dụng tính năng hiểu danh sách:

prod :: [[a]] -> [[a]] -> [[a]] 
prod as bs = [a ++ b | a <- as, b <- bs] 

Nơi (++) :: [a] -> [a] -> [a] - xem Data.List. Một khả năng khác là sử dụng ví dụ Applicative của danh sách:

import Control.Applicative 

prod as bs = (++) <$> as <*> bs 

Bây giờ bạn cần áp dụng thao tác này nhiều lần. Một lần có thể thực hiện việc này, ví dụ:

rep :: Int -> [[a]] -> [[a]] 
rep n as = foldr1 prod $ replicate n as 

rep 3 ['a','b','c'] 
--["aaa","aab","aac","aba","abb","abc","aca","acb","acc","baa","bab", 
--"bac","bba","bbb","bbc","bca","bcb","bcc","caa","cab","cac","cba", 
--"cbb","cbc","cca","ccb","ccc"] 

Hiểu được giải pháp này có thể có giá trị hơn là cắt ngắn replicateM. Điều đó nói rằng, bạn có thể đã tìm thấy sau này dễ dàng sử dụng Hoogle.

-

Để biết thêm về functors và applicative xem định nghĩa fmap (<$>) và ap (<*>). Functors, Applicatives, And Monads In Pictures cũng có thể là một nguồn tài nguyên tốt.

+0

Điều này không biên dịch. Phải có một ràng buộc kiểu cho các toán hạng được chuyển đến '++' – dopatraman

+0

Tôi đã thử điều này trong GHCi, ở đó nó hoạt động mà không có ràng buộc. Ví dụ: – Landei

+0

Bạn sửa đổi số này cho các số như thế nào? Hoặc bất kỳ loại nào khác? – dopatraman

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