Какой смысл 'fmapDefault' в 'Data.Traversable'?

Я смотрю на документацию для Data.Traversable и наткнулся fmapDefault - https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base/Data-Traversable.html

fmapDefault :: Traversable t => (a -> b) -> t a -> t b

В документации говорится, что -

Эта функция может использоваться в качестве значения для fmap в экземпляре Functor при условии, что задан ход.

Таким образом, предположительно, он может быть использован для получения fmap для Traversable пример. Тем не мение, Traversable имеет Functor как суперкласс.

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

Таким образом, вы не можете определить Traversable экземпляр без определения Functor экземпляр первый! И везде, где у вас есть Traversable, у вас есть доступ к fmap, что эквивалентно (и, возможно, более эффективно, чем) fmapDefault,

Так где бы один использовать fmapDefaultвместо гораздо более привычного fmap?

1 ответ

Решение

Это позволяет вам писать

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)
Другие вопросы по тегам