import Data.List
genkstrings :: Int -> [String] -> [String]
genkstrings k [] = []
genkstrings 1 (s:ss) = [ [c] | c <- s ] ++ genkstrings 1 ss
genkstrings k (s:ss)
| length (s:ss) < k = []
| otherwise = concat [kStartWith k c ss | c <- s ]
++
genkstrings k ss
kStartWith k c ss =
map (c :) $ genkstringsNogap (k-1) ss
genkstringsNogap 0 _ = []
genkstringsNogap 1 (s:ss) = [ [c] | c <- s ]
genkstringsNogap k (s:ss) = concat $ [kStartWithNoGap k c ss | c <- s ]
kStartWithNoGap k c ss = map (c:) (genkstringsNogap (k-1) ss)
Eingang: genkstrings 2 ["sds","ghghg"]
Haskell parallele Programmierung
Ausgang:
["sg","sh","sg","sh","sg","dg","dh","dg","dh","dg","sg","sh","sg","sh","sg"]
ich Haskell lerne und ich fand ich meinen Code parallel laufen. Ich habe einige Beispiele in den Büchern gefunden, die ich lese, aber ich verstehe nicht, wie ich es parallel programmieren kann.
wenn ich richtig bin, ich sollte es auf dieser Linie gelten
| otherwise = concat [kStartWith k c ss | c <- s ]
++
genkstrings k ss
Wie kann ich es tun?
Ich bezweifle, dass Sie viel gewinnen können, indem Sie diese Funktion parallelisieren. Es gibt hier nicht viel interessante Berechnungen, die Performance ist sehr stark an die Cache-Performance all dieser Listen gebunden. Wechseln Sie mindestens zu [Text] (http://hackage.haskell.org/package/text) oder zu [Bytestring] (http://hackage.haskell.org/package/bytestring), bevor Sie etwas Spezielleres in Betracht ziehen Optimierungen. – leftaroundabout