带列表的haskell foldr操作

ede*_*iss 0 haskell fold

给出一个负数和正数序列表,如何使用foldr将它们分为负数和正数序列?

例如[1,2,3,-1,-2,-3,1,2,3]我会得到[[1,2,3],[ - 1,-2,-3],[1, 2,3]]

有些疑惑

我如何知道我之前已经比较的分区是否与我正在比较当前分区的符号相同?

如何将元素添加到列表中?我试过类似[x]的东西:但是我得到的是每个元素作为一个列表并连接在一起,这不是结果.

我现在拥有的是这个

foldr (\ x y -> if  x >= 0  then [x]:y else y ) [[]] 
Run Code Online (Sandbox Code Playgroud)

这是错的

非常感谢您的帮助.

小智 5

我第二次使用了groupBy.但是我想提出一个观点,即0在数学中不被认为是正数.至于到目前为止还没有其他答案提到过,Num类型类的任何东西都必须实现signum,这将返回给它的数字的符号.

import Data.List     (groupBy)
import Data.Function (on) -- Can evade a lambda

signGroup :: (Num a) => [a] -> [[a]]
signGroup = groupBy ((==) `on` signum)
Run Code Online (Sandbox Code Playgroud)

用法示例:

> signGroup [1,2,3,0,0,-1,-2,1,2,0,3,4,-1]
[[1,2,3],[0,0],[-1,-2],[1,2],[0],[3,4],[-1]]
Run Code Online (Sandbox Code Playgroud)