关于 Foldable Maybe 实例的问题

F. *_*Zer 3 haskell fold

资料来源:格雷厄姆·赫顿。“ 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
Run Code Online (Sandbox Code Playgroud)

看来累加器应该在基本情况下返回(而不是mempty)。是对的吗 ?

dfe*_*uer 6

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

foldr _ v Nothing = v
Run Code Online (Sandbox Code Playgroud)

请注意,您实际上并不需要完成所有这些手动工作,除非作为练习。你可以只写

foldr _ v Nothing = v
Run Code Online (Sandbox Code Playgroud)

并完成它。如果您不想依赖语言扩展,那么您仍然只需编写一个方法:traverse。你可以写

{-# language DeriveTraversable #-}
module MyModule where
import Prelude hiding (Maybe (..))
data Maybe a = Nothing | Just a
  deriving (Show, Eq, Ord, Functor, Foldable, Traversable)
Run Code Online (Sandbox Code Playgroud)

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