小编Elr*_*iel的帖子

在Haskell中,concat懒惰地建立一个列表,但我自己的版本有一个扭曲,但没有

我正在尝试制作一个相对简单的功能,它几乎是连续的,但有一点点扭曲.它应该是二进制或每个列表的最后和第一个元素,并在过程中组合它们.我正在努力学习编写可以利用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)

optimization haskell

7
推荐指数
1
解决办法
1102
查看次数

标签 统计

haskell ×1

optimization ×1