来源:Hutton, Graham. "Programming in Haskell" (p. 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
)。没错吧?
mempty
看起来像是从foldMap
定义中搭便车而来的,因为foldMap :: Monoid m => (a -> m) -> Maybe a -> m
。 - chepner[]
实例,并将Nothing
视为[]
,将Just a
视为[a]
。 - chepner[a]
识别Just a
。[]
实例没有[a]
情况。我希望您能澄清,因为我肯定错过了您的重点。」 - F. Zer[a]
是一个非空列表。 - chepnerfmap f (x:xs) == f x : fmap f xs
,所以在单元素列表的情况下,fmap f [x] == f x : fmap f [] == f x : [] == [f x]
。 - chepner