2
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)
输入:genkstrings 2 ["sds","ghghg"]
哈斯克尔并行编程
输出:
["sg","sh","sg","sh","sg","dg","dh","dg","dh","dg","sg","sh","sg","sh","sg"]
我学习Haskell,我发现我可以运行我的代码并行。我在书中发现了一些我正在阅读的示例,但我不明白我该如何应用并行编程。
,如果我是正确的,我应该把它在这条线
| otherwise = concat [kStartWith k c ss | c <- s ]
++
genkstrings k ss
我该怎么办呢?
我怀疑你可以通过并行化这个功能赢得很多。这里没有太多有趣的计算,性能受到所有这些列表的高速缓存性能的限制。至少切换到['Text'](http://hackage.haskell.org/package/text)或['Bytestring'](http://hackage.haskell.org/package/bytestring),然后再考虑更特殊的最佳化。 – leftaroundabout