Wenn Sie die Flexibilität der Handhabung von Eingängen wollen, die nicht nur Listen von [1,11]
sind:
λ> import Control.Applicative (liftA2)
λ> let sumsOfCombinations xs = (:[]) . sum <$> foldr (liftA2 (:)) [[]] xs
Sie können jede Liste der Liste der Nummern übergeben:
λ> sumsOfCombinations' [[0,100],[-1,0,1],[0,1000]]
[-1,999,0,1000,1,1001,99,1099,100,1100,101,1101]
Einschließlich aber nicht beschränkt auf, Ihr Beispiel:
λ> sumsOfCombinations $ replicate 3 [1,11]
[[3],[13],[13],[23],[13],[23],[23],[33]]
λ> sumsOfCombinations $ replicate 4 [1,11]
[[4],[14],[14],[24],[14],[24],[24],[34],[14],[24],[24],[34],[24],[34],[34],[44]]
Hier ist seine Art:
λ> :t sumsOfCombinations
sumsOfCombinations :: (Num b, Foldable t) => t [b] -> [[b]]
A s geschrieben, sumsOfCombinations
gibt Ihnen die genaue Ausgabe, die Sie suchen. Aber ich glaube nicht, ist es notwendig, eine Liste von Listen zurück, so würde ich wählen:
λ> let sumsOfCombinations' xs = sum <$> foldr (liftA2 (:)) [[]] xs
λ> :t sumsOfCombinations'
sumsOfCombinations' :: (Num b, Foldable t) => t [b] -> [b]
λ> sumsOfCombinations' $ replicate 3 [1,11]
[3,13,13,23,13,23,23,33]
Beachten Sie, dass Sie einen Helfer aus jedem dieser extrahieren können, um Ihnen die Kombinationen von Elementen aus den Listen :
λ> let combinations = foldr (liftA2 (:)) [[]]
λ> combinations [[1,2],[3,4],[5,6]]
[[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]]
Also dann haben Sie:
sumsOfCombinations xs = (:[]) . sum <$> combinations xs
oder, wenn Sie nicht über eine Liste von Listen zurückgeben müssen:
sumsOfCombinations' xs = sum <$> combinations xs
ja danke - auf der Suche nach ... nub $ map sum $ Sequenz [[1,11], [1,11]] usw. als nicht monadisch ... – Craig