Haskell:使用列表理解拆分列表

Haskell:使用列表理解拆分列表,haskell,split,list-comprehension,miranda,Haskell,Split,List Comprehension,Miranda,如何使用列表理解将列表分成两半 e、 g.如果我有[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 half mylist=[r | mylist!r;r这对于列表理解来说并不合适。列表理解是映射和筛选器(以及ZIP)的替代语法。拆分列表是一个复杂的过程 这样,你应该考虑一种不同的方法。例

如何使用列表理解将列表分成两半

e、 g.如果我有
[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

half mylist=[r | mylist!r;r这对于列表理解来说并不合适。列表理解是映射和筛选器(以及ZIP)的替代语法。拆分列表是一个复杂的过程

这样,你应该考虑一种不同的方法。例如< /P>

halve :: [a] -> [a]
halve [] = []
halve xs = take (n `div` 2) xs
    where n = length xs

拆分在大型列表上并不是一个很好的操作,因为您首先使用长度(因此它在列表上总是n+n/2操作。它更适合于具有O(1)的类似数组的类型)长度和拆分。

对于列表理解来说,这并不是一件合适的事情。列表理解是映射和筛选器(以及ZIP)的替代语法。拆分列表是一件复杂的事情

这样,你应该考虑一种不同的方法。例如< /P>

halve :: [a] -> [a]
halve [] = []
halve xs = take (n `div` 2) xs
    where n = length xs

拆分在大型列表上并不是一个很好的操作,因为您首先使用长度(因此在列表上始终是n+n/2操作)。它更适合于具有O(1)长度和拆分的类似数组的类型。

另一种可能的解决方案,使用布尔保护:

half xs = [x | (x,i) <- zip xs [1..], let m = length xs `div` 2, i <= m]

half xs=[x |(x,i)另一种可能的解决方案,使用布尔保护:

half xs = [x | (x,i) <- zip xs [1..], let m = length xs `div` 2, i <= m]

half-xs=[x |(x,我)很感谢你的回答,但这在米兰达是行不通的。没有splitAt函数……我可以指出米兰达是一种死语言。尽管如此,你仍然可以自己实现
splitAt
,就像
splitAt-nxs=(取nxs,取nxs)
——我们还是应该使用
take
)哈,相信我,我完全知道米兰达已经死了。不幸的是,我的讲师在上面写了课本,因此我们不得不学习它。这很有趣。'take'!哇,我完全错过了这个函数。是的,这解决了很多问题---谢谢!感谢你的回答,但这在米兰达是行不通的。没有splitAt函数…可以吗我只是指出Miranda是一种死语言。尽管如此,您仍然可以自己实现
splitAt
,就像
splitAt nxs=(取nxs,去掉nxs)
——我们应该使用
take
)哈,相信我,我完全知道米兰达死得有多惨。不幸的是,我的讲师在上面写了课本,因此我们不得不学习它。这很有趣。‘拿去吧!’哇,我完全错过了这个功能。是的,这解决了很多问题——谢谢!一开始令人惊讶,但这和唐的建议或mo一样有效很明显,
以n=length mylist`div`2为例,不知道Miranda实现会做什么。一开始令人惊讶,但这和dons的建议一样有效,或者更明显的
以n=length mylist`div`2为例,不知道Miranda实现会做什么。