Haskell过滤/拆分列表

cri*_*der 7 haskell list

我想要类似的东西

splitBy pred list = ( filter pred list, filter (not . pred) list )
Run Code Online (Sandbox Code Playgroud)

但一次通过.

Nik*_* B. 12

您正在寻找以下partition功能Data.List:

partition :: (a -> Bool) -> [a] -> ([a], [a])
Run Code Online (Sandbox Code Playgroud)

它可以使用折叠很好地实现:

splitBy pred = foldr f ([], []) 
    where f x ~(yes, no) = if pred x then (x : yes, no) 
                                    else (yes, x : no)
Run Code Online (Sandbox Code Playgroud)

  • 这是一种懒惰的模式.对于可反射模式`pat`(如`(x,y)`is),`~pat`使模式无可辩驳,即参数绑定到模式而不检查它(以及相应子模式的组件) - 当传递的参数确实与模式不匹配时,运行时会出现模式匹配失败.对于具有严格模式的`partition`,折叠必须遍历整个列表以查看第二个参数确实匹配,然后构建一对向后遍历的列表.使用懒惰模式,它可以立即开始构建. (2认同)