简化Haskell函数

use*_*747 2 haskell

我正在编写小函数来切断给定长度的数据包中的字符串,但我是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/=""过滤数据包中的结果?

Wil*_*ess 5

你的功能是

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)