Haskell takeWhile但是为了列表,而不是它的元素

时间:2015-10-04 00:22:25

标签: haskell

我有一个无限的列表,我正在连接到一个字符串。

foldl1 (++) $ map show [1..]

我想要的是在字符串长度达到10个字符或更长时将其剪掉。

但是,takeWhile对列表中的各个元素进行操作。是否有一个函数可以用来在超过十个字符时关闭列表?

在这种情况下,我希望函数输出“123456789”,忽略10,因为过度会导致太大的长度。

编辑:这是我的实际代码。这就是我所描述的。

succProd x = last. takeWhile ((<10).length) . scanl1 (++) $ map (show.(x*)) [1..]

谢谢!

2 个答案:

答案 0 :(得分:5)

使用scanl代替foldl获取所有中间结果的列表,并选择您满意的最后一个:

last . takeWhile ((< 10) . length) . scanl1 (++) $ map show [1..]
"123456789"

答案 1 :(得分:0)

使用inits从列表的开头生成子字符串,在未传达条件时删除它们,

import Data.List
head . dropWhile ((<10-1) . length ) $ inits $ concatMap show [1..]

last . takeWhile ((<10) . length ) $ inits $ concatMap show [1..]