tet*_*s11 1 haskell split list-comprehension miranda
如何使用列表理解将列表分成两半?
如果我有[1,1,2,2,3,3,4,4,5,5] ,我只想要[1,1,2,2,3]
到目前为止我的尝试:
half mylist = [r | mylist!r ; r <- [0..(#mylist div 2)] ] ||does not work
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
[Nb:这实际上并不是Haskell,而是类似的.!用于索引列表,#给出长度)
编辑::
好的,事实证明
half mylist = [r | r <- [mylist!0..mylist!(#mylist div 2)] ]
Run Code Online (Sandbox Code Playgroud)
有效,但仅限于数字列表而非字符串.有线索吗?
这对列表理解来说并不合适.列表推导是地图和过滤器(和拉链)的替代语法.拆分列表是一种折叠.
因此,您应该考虑采用不同的方法.例如
halve :: [a] -> [a]
halve [] = []
halve xs = take (n `div` 2) xs
where n = length xs
Run Code Online (Sandbox Code Playgroud)
拆分对大型列表来说不是一个很好的操作,因为你先取长度(所以它总是在列表上进行n + n/2次操作.它更适合于具有O(1)长度和拆分的类似数组的类型.