我有一个无限的列表,我正在连接到一个字符串。
foldl1 (++) $ map show [1..]
我想要的是在字符串长度达到10个字符或更长时将其剪掉。
但是,takeWhile对列表中的各个元素进行操作。是否有一个函数可以用来在超过十个字符时关闭列表?
在这种情况下,我希望函数输出“123456789”,忽略10,因为过度会导致太大的长度。
编辑:这是我的实际代码。这就是我所描述的。
succProd x = last. takeWhile ((<10).length) . scanl1 (++) $ map (show.(x*)) [1..]
谢谢!
答案 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..]