我正在尝试制作一个相对简单的功能,它几乎是连续的,但有一点点扭曲.它应该是二进制或每个列表的最后和第一个元素,并在过程中组合它们.我正在努力学习编写可以利用Data.List.Stream中的Stream Fusion功能的代码
我检查了base中的concat做了什么需要并且懒惰地构建列表,但是,我创建的这个版本没有.在基数中,concat指定如下:
concat :: [[a]] -> [a]
concat = foldr (++) []
(++) :: [a] -> [a] -> [a]
(++) [] ys = ys
(++) (x:xs) ys = x : xs ++ ys
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
bconcat :: [[Word8]] -> [Word8]
bconcat = foldr1 bappend
bappend :: [Word8] -> [Word8] -> [Word8]
bappend as bs = init as ++ (last as .|. head bs) : tail bs
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何编写这个列表是懒惰的?我甚至尝试通过模仿基础中的(++)定义来编写bappend,但它没有什么区别.
目前,我使用以下代码,它按照我想要的方式工作,但性能落后于concat.此外,它使用我想避免的显式递归.
bconcat :: [[Word8]] -> [Word8]
bconcat (a:b:xs) = init a ++ bconcat …Run Code Online (Sandbox Code Playgroud)