我想要一個替代filter
,而不是丟棄錯誤的情況下,讓他們在一個單獨的地方。我想出了下面的內容,但不幸的是它顛倒了名單。顛倒列表順序,而不會增加複雜性
顯然我可以將x附加到ys或zs而不是cons,但這會顯着增加複雜性。
有沒有辦法在不增加複雜性的前提下保持順序?
splitBy :: (a -> Bool) -> [a] -> ([a],[a])
splitBy f xs = splitBy' f xs ([],[])
where
splitBy' :: (a -> Bool) -> [a] -> ([a],[a]) -> ([a],[a])
splitBy' _ [] result = result
splitBy' f (x:xs) (ys,zs) = if f x then splitBy' f xs (x:ys,zs)
else splitBy' f xs (ys,x:zs)
A [hoogle搜索](https://www.haskell.org/hoogle/?hoogle=%28a-%3EBool%29-%3E%5Ba%5D-%3E%28%5Ba%5D%2C%5Ba%5D%29)顯示該功能被稱爲「分區」。 – 2015-02-07 20:47:10
感謝您的提示,要找到源代碼並查看它是否保持順序而不會增加複雜性。我是Haskell的新手,不習慣在除前奏之外的地方尋找。 – 2015-02-07 20:49:35
學習[分區的源代碼](http://hackage.haskell.org/package/base-4.7.0.2/docs/src/Data-List.html#partition):它有效地將元素添加到末尾正在建立的清單(兩者)。懶惰模式('〜')允許將無限列表作爲輸入(例如'take 10 $ fst $ partition odd [1 ..]')。 – 2015-02-07 23:56:16