关于可折叠的"也许"实例的问题



来源:Hutton,Graham">Haskell中的编程";(第267页(

  1. 通过明确定义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

似乎应该在基本情况下返回acmulator(而不是mempty(。是这样吗?

是的,您正在查看的代码是伪造的,甚至不会编译。它应该按照你说的去做:

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的情况下,这应该产生所有类方法的最佳定义。对于某些类型,您需要手动编写一些方法来获得最佳结果。例如,对于递归类型,默认值通常不会给出<$的良好定义。

最新更新