資料來源:赫頓,格雷厄姆。“ Haskell 編程”(第 267 頁)
- 通過給出 fold、foldMap、foldr、foldl 和 traverse 的顯式定義,展示如何使 Maybe 型別可折疊和可遍歷。
我做了foldr定義。為了檢查我的解決方案,我在網上找到了這段代碼:
-- foldr :: (a -> b -> b) -> b -> Maybe a -> b
foldr _ _ Nothing = mempty
foldr f v (Just a) = f a v
似乎應該在基本情況下回傳累加器(而不是mempty)。是對的嗎 ?
uj5u.com熱心網友回復:
是的,您正在查看的代碼是偽造的,甚至無法編譯。它應該做你所說的:
foldr _ v Nothing = v
請注意,除了作為練習之外,您實際上并不需要完成所有這些手動作業。你可以寫
{-# language DeriveTraversable #-}
module MyModule where
import Prelude hiding (Maybe (..))
data Maybe a = Nothing | Just a
deriving (Show, Eq, Ord, Functor, Foldable, Traversable)
并完成它。如果您不想依賴語言擴展,那么您仍然只需要撰寫一種方法:traverse. 你可以寫
import Prelude hiding (Maybe (..))
import Data.Traversable
data Maybe a = Nothing | Just a deriving (Show, Eq)
instance Foldable Maybe where
foldMap = foldMapDefault
instance Functor Maybe where
fmap = fmapDefault
instance Traversable Maybe where
traverse _ Nothing = _1 -- fill in the blanks
traverse f (Just a) = _2
在 的情況下Maybe,這應該產生所有類方法的最佳定義。對于某些型別,您需要手動撰寫一些方法以獲得最佳結果。例如,默認值通常不會<$為遞回型別提供良好的定義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411554.html
標籤:
