我正在查看Data.Traversable
的文档并遇到fmapDefault
- https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base/Data-Traversable.html#g:3
fmapDefault :: Traversable t => (a -> b) -> t a -> t b
文档说明 -
如果定义了遍历,则此函数可用作Functor实例中fmap的值。
因此,可以假设它可以用于为fmap
实例派生Traversable
。但是,Traversable
将Functor
作为超类。
class (Functor t, Foldable t) => Traversable t where
...
因此,如果不首先定义Traversable
实例,则无法定义Functor
实例!无论您拥有Traversable
,您都可以访问fmap
,这相当于fmapDefault
的效率(也许效率更高)。
那么哪个人会使用fmapDefault
,而不是更熟悉的fmap
?
答案 0 :(得分:11)
它允许你写
data Foo a = ...
instance Functor Foo where -- we do define the functor instance, but we “cheat”
fmap = fmapDefault -- by using `Traversable` in its implementation!
instance Traversable Foo where
traverse = ... -- only do this manually.
那就是说,我不认为这是非常明智的。 Functor实例通常很容易手工完成,明显的实现确实可能比Traversable
派生的实现更有效。通常,实例实际上可以自动创建:
{-# LANGUAGE DeriveFunctor #-}
data Foo a = ...
deriving (Functor)