资料来源:格雷厄姆·赫顿。“ 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
Run Code Online (Sandbox Code Playgroud)
看来累加器应该在基本情况下返回(而不是mempty)。是对的吗 ?
是的,您正在查看的代码是伪造的,甚至无法编译。它应该按照你说的做:
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,这应该产生所有类方法的最佳定义。对于某些类型,您需要手动编写一些方法才能获得最佳结果。例如,默认值通常不会给出<$递归类型的良好定义。