2013-10-31 58 views
2

我想创建分裂串子,其中每个子具有k的长度的列表功能:分割字符串子

*Main> split_string_to_kmers "some_text" 3 
["som","ome","me_","e_t","_te","tex","ext"] 

这里是我的解决方案:

split_string_to_kmers s k = split_string_to_kmers_helper s k [] 
    where split_string_to_kmers_helper [] k acc = acc 
      split_string_to_kmers_helper s k acc 
      | length s >= k = split_string_to_kmers_helper (tail s) k (acC++ [(take k s)]) 
      | otherwise = acc 

我只是想知道如果有一种方法来重写我的代码,所以它会更具有特定的Haskell。

+2

的可能重复的[SplitAt 3,然后继续分裂(http://stackoverflow.com/questions/19568178/splitat-3-and-then-keep-on-splittin克)我猜这是略有不同 – DiegoNolan

回答

2

我想这足以略有不同。

import Data.List (tails) 

mySplit :: String -> Int -> [String] 
mySplit str k = filter (\s -> length s == k) $ map (take k) (tails str) 

您可以通过组合滤镜和贴图来提高效率。但这取决于你。

2

简单的解决方案是下一个(不是名单的同尾):

import Data.List.Split(chop) 

splitRepN n = chop (\xs -> (take n xs,tail xs)) 

我们有下一个结果:

> splitRepN 3 "some_text" 
["som","ome","me_","e_t","_te","tex","ext","xt","t"] 

我们剪短尾巴的完整的解决方案:

splitRepN' n = takeWhile ((== n). length) . splitRepN n 

> splitRepN' 3 "some_text" 
["som","ome","me_","e_t","_te","tex","ext"]