【发布时间】:2013-02-19 23:49:46
【问题描述】:
我想要类似的东西
splitBy pred list = ( filter pred list, filter (not . pred) list )
但一次通过。
【问题讨论】:
-
Hoogle 是你的朋友。
我想要类似的东西
splitBy pred list = ( filter pred list, filter (not . pred) list )
但一次通过。
【问题讨论】:
您正在寻找来自Data.List 的partition 函数:
partition :: (a -> Bool) -> [a] -> ([a], [a])
使用折叠可以很好地实现:
splitBy pred = foldr f ([], [])
where f x ~(yes, no) = if pred x then (x : yes, no)
else (yes, x : no)
【讨论】:
f x ~(yes,no) = if ...,否则它在无限列表上根本不起作用,并且对于长有限列表效率低下。
pat(如(x,y) 是),~pat 使模式不可辩驳,即参数绑定到模式而不检查它(以及相应的子模式的组件) - 并且当参数通过实际上与模式不匹配,您在运行时会遇到模式匹配失败。对于partition,使用严格的模式,折叠必须遍历整个列表以查看第二个参数确实匹配,然后构建向后遍历的列表对。使用惰性模式,它可以立即开始构建。
f x pair = if pred x then (x:fst pair, snd pair) else (fst pair, x:snd pair),只是更好。