8

我正在查看文档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

该文件指出 -

如果定义了 traverse,则此函数可以用作 Functor 实例中 fmap 的值。

所以大概它可以用来导出fmap一个Traversable实例。然而,Traversable作为Functor一个超类。

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

所以你不能在不先定义Traversable实例的情况下定义Functor实例!并且无论你有一个Traversable,你都可以访问一个fmap,这相当于(并且可能比更有效)fmapDefault

那么将在哪里使用fmapDefault,而不是更熟悉fmap

4

1 回答 1

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.

话虽如此,我认为这并不明智。函子实例通常很容易手工完成,显而易见的实现确实可能比Traversable派生的更有效。通常,实例实际上可以自动创建:

{-# LANGUAGE DeriveFunctor #-}

data Foo a = ...
       deriving (Functor)
于 2015-07-05T11:11:33.167 回答