Haskell:使用list comprehension拆分列表

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)

有效,但仅限于数字列表而非字符串.有线索吗?

Don*_*art 8

这对列表理解来说并不合适.列表推导是地图和过滤器(和拉链)的替代语法.拆分列表是一种折叠.

因此,您应该考虑采用不同的方法.例如

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)长度和拆分的类似数组的类型.