gpt4 book ai didi

haskell - 关于 Foldable Maybe 实例的问题

转载 作者:行者123 更新时间:2023-12-05 01:25:50 25 4
gpt4 key购买 nike

来源:赫顿,格雷厄姆。 “Haskell 编程”(第 267 页)

  1. Show how the Maybe type can be made foldable and traversable, by giving explicit definitions for fold, foldMap, foldr, foldl and traverse.

我做了 foldr 定义。为了检查我的解决方案,我在网上找到了这段代码:

 -- foldr :: (a -> b -> b) -> b -> Maybe a -> b
foldr _ _ Nothing = mempty
foldr f v (Just a) = f a v

看起来应该在基本情况下返回累加器(而不是 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的情况下,这应该产生所有类方法的最佳定义。对于某些类型,您需要手动编写一些方法以获得最佳结果。例如,默认值通常不会很好地定义 <$。对于递归类型。

关于haskell - 关于 Foldable Maybe 实例的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70672535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com