我正在编写小函数来切断给定长度的数据包中的字符串,但我是Haskell的初学者,我想我可以简化我的功能.他们来了 :
packetAux _ [] = []
packetAux 0 ls = []
packetAux n l@(x:xs) = if n > (length l) then [] else x : packetAux (n - 1) xs
packet _ [] = []
packet 0 l = []
packet n l@(x:xs) = [x | x <- ((packetAux n l) : (packet n xs)), x /= ""]
Run Code Online (Sandbox Code Playgroud)
例如:包2"12345"给出["12","23","34","45"]
我怎么能避免1)packetAux和数据包中的重复2)用x/=""过滤数据包中的结果?
你的功能是
import Data.List (tails)
packets :: Int -> [a] -> [[a]]
packets n xs = filter ((==n).length) $ map (take n) $ tails xs
Run Code Online (Sandbox Code Playgroud)
写它的另一种方法是
packets n xs = foldr (zipWith (:)) (repeat []) $ take n $ tails xs
Run Code Online (Sandbox Code Playgroud)
这两种变体实际上也会以有效的方式在无限列表上工作.
$ 运算符只是为了便于分组而没有括号:
f $ g $ x = f ( g ( x ) )
Run Code Online (Sandbox Code Playgroud)