有沒有使用自己型別的過濾器的實體?現在我有這種型別:
data Tree a = Leaf | Node a Color (Tree a) (Tree a) deriving (Show)
我想寫這樣的東西:
filter (>4) tree
如果有這樣的實體,有人可以給我一個示例代碼,因為我不明白它與 fmap 有何不同
uj5u.com熱心網友回復:
在base中,沒有型別類 forfilter并且它只能用于串列。但是如果你使用package witherable,那么你會得到一個Filterable你可以使用的型別類。這是您的型別的一個可能實體的開頭:
instance Filterable Tree where
mapMaybe _ Leaf = Leaf
mapMaybe f (Node x c l r) = case f x of
Just j -> _
Nothing -> _
where l' = mapMaybe f l
r' = mapMaybe f r
完成寫作后,mapMaybe您將免費獲得。catMaybesfilter
uj5u.com熱心網友回復:
無論如何,任何洗掉專案的過濾器都會涉及大量的重新平衡,對于紅黑樹來說,不是嗎?所以我不確定這是否比將元素作為串列保留并通過插入從頭開始重建樹更有效。假設明顯的Foldable Tree實體和一個函式insert :: a -> Tree a -> Tree a,我只是定義
filterTree :: (a -> Bool) -> Tree a -> Tree a
filterTree f = foldr insert Leaf . foldMap keep
where keep n | f n = [n]
| otherwise = []
但當然,因為它顯然很貴,我會盡量避免使用它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/537523.html
標籤:哈斯克尔
上一篇:在asp.netcoremvc中使用ajax從資料庫獲取有限資料
下一篇:多個變數被識別為決議錯誤
