Es ist als Mitglied enthalten, um Benutzern zu ermöglichen, es für Geschwindigkeit anzupassen, und ich denke, da es mit >>
konsistent macht.
Ich denke, es könnte schneller sein in den Fällen des Lesers Monad ((->) r)
.
x <$ _ = const x
vs
x <$ fa = fmap (const x) fa = (const x) . fa
obwohl, das ist wirklich eine Frage der Compiler-Optimierung. Und es scheint nicht für die Leser-Monade in der Basis definiert zu sein.
Es könnte auch zu einer Leistungssteigerung in strengen Sammlungen führen. Nämlich
data Strict a = Strict !a
instance Functor Strict where
fmap f (Strict a) = Strict (f a)
x <$ _ = Strict x
dies nicht gehorcht die Funktors Gesetze, aber dennoch, könnten Sie dies in einigen Situationen tun wollen.
Ein drittes Beispiel stammt aus unendlichen Sammlungen.Betrachten unendliche Listen
data Long a = Cons a (Long a)
instance Functor Long where
fmap f (Cons x xs) = Cons (f x) (fmap f xs)
der gut arbeitet, aber denken Sie
countUpFrom x = Cons x (countUpFrom (x+1))
ones = 1 <$ (countUpFrom 0)
jetzt mit unserer Definition, die
ones = 1 <$ (countUpFrom 0)
= fmap (const 1) (countUpFrom 0)
= Cons (const 1 0) (fmap (const 1) (countUpFrom 1)
= Cons (const 1 0) (Cons (const 1 1) (fmap (const 1) (countUpFrom 2))
erweitern wird, das heißt, es wird eine ganze Reihe von zuteilen Cons
Zellen, wie Sie diese Liste gehen. Während auf der anderen Seite, wenn Sie definiert
x <$ _ = let xs = Cons x xs in xs
als
ones = 1 <$ countUpFrom 0
= let xs = Cons 1 xs in xs
, die den Knoten gebunden hat. Ein noch extremes Beispiel kommt mit unendlich vielen Bäumen
data ITree a = ITree a (ITree a) (ITree a)
Im Wesentlichen könnten Sie einen effizienteren Anwendungsfall haben. Wenn Sie dies nicht tun, behalten Sie die Standardeinstellung bei. Es bedeutet, dass Sie sich nur für Struktur, nicht Wert interessieren. – PyRulez