&f; fmapDefault'有什么意义?在' Data.Traversable'?

时间:2015-07-05 11:00:13

标签: haskell typeclass functor traversable

我正在查看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。但是,TraversableFunctor作为超类。

class (Functor t, Foldable t) => Traversable t where
    ...

因此,如果不首先定义Traversable实例,则无法定义Functor实例!无论您拥有Traversable,您都可以访问fmap,这相当于fmapDefault的效率(也许效率更高)。

那么哪个人会使用fmapDefault,而不是更熟悉的fmap

1 个答案:

答案 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)