這是一個遞歸解決方案。
- 彈出列表的第一個元素(
x
)。
- 使用
partition
到列表中的其餘部分分割成是相當於x
(group
)元素和元素不相當於x
(others
)。
x:group
是我們發現的第一個組,然後我們遞歸others
。
import Data.List (partition)
equivalent :: (a -> a -> Bool) -> [a] -> [[a]]
equivalent eq = go
where
go [] = []
go (x:xs) =
let (group, others) = partition (eq x) xs
in (x:group) : go others
證明使用:
>>> import Data.Function (on)
>>> equivalent ((==) `on` (`mod` 3)) [1..10]
[[1,4,7,10],[2,5,8],[3,6,9]]
順便說一句,這裏是另一種方式來完成同樣的事情,我懷疑是速度快:
>>> fmap (fmap snd) . groupBy ((==) `on` fst) . sort . fmap (\i -> (i `mod` 3, i)) $ [1..10]
[[3,6,9],[1,4,7,10],[2,5,8]]
你有什麼試過?什麼地方出了錯? –
我嘗試從[1 ... 10]中提取兩個值並嘗試使用函數eq進行等價判斷,但我不知道如何將具有兩個參數的函數傳遞給'filter'。 – notfounds
我誤解了'Eq',我會重新思考。 – notfounds