2013-10-31 59 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"]