gpt4 book ai didi

haskell - Haskell 函数的简化

转载 作者:行者123 更新时间:2023-12-02 07:27:15 25 4
gpt4 key购买 nike

我正在编写一些小函数来将字符串分割成给定长度的数据包,但我是 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 /= ""]

例如:数据包 2 "12345"给出 ["12","23","34","45"]

我该如何避免1) packetAux 和 packet 中的重复2) 用 x/= ""过滤数据包中的结果?

最佳答案

你的函数是

import Data.List (tails)

packets :: Int -> [a] -> [[a]]
packets n xs = filter ((==n).length) $ map (take n) $ tails xs

另一种写法是

packets n xs = foldr (zipWith (:)) (repeat []) $ take n $ tails xs

这两种变体实际上也可以高效地处理无限列表。

$ 运算符只是为了方便分组而不带括号:

f $ g $ x = f ( g ( x ) ) 

关于haskell - Haskell 函数的简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26826504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com