【问题标题】:Haskell filter/split listHaskell 过滤器/拆分列表
【发布时间】:2013-02-19 23:49:46
【问题描述】:

我想要类似的东西

splitBy pred list = ( filter pred list, filter (not . pred) list )

但一次通过。

【问题讨论】:

  • Hoogle 是你的朋友。

标签: list haskell


【解决方案1】:

您正在寻找来自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 ...,否则它在无限列表上根本不起作用,并且对于长有限列表效率低下。
  • @Daniel:我从未见过这种语法,这是什么意思?非严格元组?
  • 这是一种惰性模式。对于可反驳的模式pat(如(x,y) 是),~pat 使模式不可辩驳,即参数绑定到模式而不检查它(以及相应的子模式的组件) - 并且当参数通过实际上与模式不匹配,您在运行时会遇到模式匹配失败。对于partition,使用严格的模式,折叠必须遍历整个列表以查看第二个参数确实匹配,然后构建向后遍历的列表对。使用惰性模式,它可以立即开始构建。
  • 这使它等同于f x pair = if pred x then (x:fst pair, snd pair) else (fst pair, x:snd pair),只是更好。
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
相关资源
最近更新 更多