資料來源:赫頓,格雷厄姆。“ Haskell 編程”(第 267 頁)
- 使用 foldMap,在可用于任何可折疊型別的串列上定義高階函式過濾器的通用版本:
filterF :: Foldable t => (a -> Bool) -> t a -> [a]
我正在做這個練習并且有一些問題:
- 不是正確的型別
filterF :: Foldable t => (a -> Bool) -> t a -> t a嗎?過濾器不應該保留容器的結構嗎?
這是我的嘗試;這是正確的嗎 ?我應該Monoid限制t嗎?
filterF :: Foldable t => (a -> Bool) -> t a -> t a
filterF p = foldMap (\x -> if p x then pure x else mempty)
uj5u.com熱心網友回復:
Foldable 的功能不足以實作保留容器形狀的過濾操作。我經常認為 Foldable 是“任何你可以做成串列的東西”。值得注意的是,這并不意味著您可以將串列重新轉換為特定的可折疊型別。因此,這個 filterF 只能回傳[a]。
您的實作很好,但與您的型別簽名不匹配。向 GHCI 詢問型別,你會發現:
> :t filterF
filterF
:: (Foldable t, Monoid (f a), Applicative f) =>
(a -> Bool) -> t a -> f a
這可以專門用于本書要求的型別 ( Foldable t => (a -> Bool) -> t a -> [a]),但不能專門用于您認為此操作應該具有的型別 ( Foldable t => (a -> Bool) -> t a -> t a)。特別是,您聲稱t ~ f,但您實際上不能保證:您使用不同的型別(必須是 Monoid 和 Applicative 但不必是可折疊的)來建立回傳值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411552.html
標籤:
上一篇:通過建構式比較值
