2012-03-13 13 views
5

में सूचियों का सारांश मुझे एक ऐसा फ़ंक्शन चाहिए जो किसी भी प्रकार की दो सूचियों को लेता है और एक (यानी f:: [[a]] -> [[a]] -> [[a]]) देता है। असल में, दो इनपुट सूचियों के 'concatenation' भी उत्पादन करते हैं।हास्केल

उदा।

> f [[1,2,3], [123]] [[4,5,6], [3,7]] 
[[1,2,3,4,5,6], [1,2,3,3,7], [123,4,5,6], [123,3,7]] 

मैं वर्तमान में इसके साथ अब तक इस मिल गया है:

f _ [] = [] 
f [] _ = [] 
f (xs:xss) (ys:yss) = ((xs ++ ys) : [m | m <- f [xs] yss]) 

लेकिन इस खाते xss में लेने के लिए और गलत है है। कोई सुझाव?

उत्तर

9

यह एक कार्टेशियन उत्पाद है, इसलिए आप बस सब कुछ करने के लिए एक सूची समझ का उपयोग कर सकते हैं।

Prelude> let xs = [[1,2,3], [123]] 
Prelude> let ys = [[4,5,6], [3,7]] 
Prelude> [x ++ y | x <- xs, y <- ys] 
[[1,2,3,4,5,6],[1,2,3,3,7],[123,4,5,6],[123,3,7]] 
3
import Control.Applicative 

(++) <$> [[1,2,3], [123]] <*> [[4,5,6], [3,7]] 
[[1,2,3,4,5,6],[1,2,3,3,7],[123,4,5,6],[123,3,7]] 
+10

या बस 'liftA2 (++) ' – luqui

3
f l1 l2 = [x ++ y | x <- l1, y <- l2] 
+0

मुझे यह कैसे याद आया!? खुद को लात मारना बुनियादी बुनियादी सामान! –

2

Alternative में: सूचियों के किसी भी संख्या के संयोजन के लिए

import Control.Applicative 

f :: (Applicative f, Alternative g) => f (g a) -> f (g a) -> f (g a) 
f = liftA2 (<|>) 
1
f a b = map concat . sequence $ [a,b] 

तराजू अप।