2015-07-05 10 views
8

ich für Data.Traversable in der Dokumentation suchen und stieß auf fmapDefault - https://downloads.haskell.org/~ghc/latest/docs/html/libraries/base/Data-Traversable.html#g:3Was ist der Punkt von 'fmapDefault' in 'Data.Traversable'?

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

In der Dokumentation, die -

Diese Funktion als Wert für fmap in einer Functor Instanz verwendet werden kann, sofern der Polygonzug definiert ist.

So vermutlich kann es verwendet werden, um eine fmap für eine Traversable Instanz abzuleiten. Jedoch hat TraversableFunctor als eine Oberklasse.

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

So können Sie keine Traversable Instanz ohne zu definieren, die Functor Instanz zuerst definieren! Und wo immer Sie eine Traversable haben, haben Sie Zugriff auf eine fmap, die (und vielleicht effizienter als) fmapDefault entspricht.

Also wo würde man fmapDefault statt der viel vertrauten fmap verwenden?

+2

"Sie können keine 'Traversable' -Instanz definieren, ohne zuerst die'Functor'-Instanz zu definieren!" Nun, "zuerst" ist so ein skurriler Begriff ... –

+0

Ja, das war ein bisschen wie ein Hirnpupus. Wie angenommen, dass 1 vor 2 kommt, aufgrund von Jahren des prozeduralen Zählens von 0-10. Und dann überlegst du die Frage - was zuerst kommt, "-1" oder "-2" und bist erleuchtet. –

Antwort

11

Es ermöglicht Ihnen

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. 

Das heißt zu schreiben, ich glaube nicht, das wirklich sinnvoll ist. Functor-Instanzen sind in der Regel trivial, um von Hand zu tun, und die offensichtliche Implementierung wird in der Tat wahrscheinlich effizienter sein als eine abgeleitete. Normalerweise kann die Instanz tatsächlich automatisch erstellt werden:

{-# LANGUAGE DeriveFunctor #-} 

data Foo a = ... 
     deriving (Functor) 
+0

* Normalerweise kann die Instanz tatsächlich automatisch erstellt werden [...] * Ist das nicht immer der Fall? – Jubobs

+3

@Jubobs: nicht ganz, für einige GADTs habe ich Fehler über gut-kinddedness mit 'DeriveFunctor' bekommen. Aber möglicherweise war das nur ein Fehler in GHC-7.8. – leftaroundabout

+2

Verdammt, ich hatte unterbewusst angenommen, dass "Subklassen" -Definitionen nicht auf "Superklassen" -Definitionen verweisen können. Dies ist im Nachhinein offensichtlich eine willkürliche Anforderung. Das bekommen Sie, wenn Sie die Hälfte der Zeit benutzen müssen. –

Verwandte Themen