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

该文档指出-



因此,大概可以将其用于派生fmap实例的Traversable。但是,Traversable具有Functor作为父类(super class)。
class (Functor t, Foldable t) => Traversable t where
    ...

因此,如果不先定义Traversable实例,就无法定义Functor实例!无论您在哪里拥有Traversable,都可以访问fmap,它相当于fmapDefault(并且可能比fmapDefault效率更高)。

那么,人们会在哪里使用fmap而不是更加熟悉的ojit_code?

最佳答案

它可以让你写

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)

关于haskell - 'fmapDefault'中 'Data.Traversable'的意义是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31229674/

10-11 00:32