【发布时间】:2017-07-16 16:46:11
【问题描述】:
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或Bytestring。
标签: haskell functional-programming