Какой смысл '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)