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