According to the Haskell wikibook, ein Monad
genannt m
ein Functor
mit zwei zusätzlichen Operationen ist:Es ist keine Monade, aber was ist es?
unit :: a -> m a
join :: m (m a) -> m a
das ist schön, aber ich habe etwas ein wenig anders. Glossing über die blutigen Details, habe ich einen Typ, der gute unit
und join
Funktionen hat, aber seine fmap
ist nicht gut erzogen (fmap g . fmap f
ist nicht notwendigerweise fmap (g.f)
). Aus diesem Grund kann es keine Instanz von Monad
gemacht werden. Trotzdem möchte ich so viel generische Funktionalität wie möglich geben.
Also meine Frage ist, welche Kategorie theoretische Strukturen sind ähnlich wie Monaden, dass sie eine unit
und join
haben?
Ich weiß, dass auf einer Ebene die obige Frage schlecht definiert ist. Für Monaden sind die unit
und join
Definitionen nur in Bezug auf die fmap
Definition sinnvoll. Ohne fmap
können Sie keine der Monad-Gesetze definieren, daher wären alle Definitionen von unit
/join
gleichermaßen "gültig". So suche ich nach anderen Funktionen als fmap
, dass es sinnvoll sein könnte, einige "Not-Monad" Gesetze über diese unit
und join
Funktionen zu definieren.
Können Sie mehr über die Struktur beschreiben Sie haben, und was insbesondere Ursachen es das Fusionsgesetz zum Scheitern verurteilt für 'fmap'? – luqui
Ich nehme an, Sie haben "fmap" speziell so "optimiert", dass 'join' das 2. Monadengesetz erfüllt? Normalerweise erhält man fast immer 'fmap g. fmap f ≡ fmap $ f.g' nur automatisch. – leftaroundabout
@luqui Ich interessiere mich mehr für den allgemeinen als nur diesen speziellen Fall, aber es ist eine normale Verteilung. Wenn Sie an 'fmap' denken, dass Sie eine Funktion auf jeden Punkt in einer Distribution anwenden, dann gehorcht' fmap' nur den 'Funktor'-Gesetzen für Addition und Multiplikation. 'Einheit' trainiert an einem einzelnen Datenpunkt und' Join' verbindet eine "Normalverteilung von Normalverteilungen" zu einer einzigen Normalverteilung. Offensichtlich erfordert dies einige Einschränkungen für die Parameter, so dass es überhaupt nicht möglich ist, die "Base" -Typklassen zu verwenden und ich "ConstraintKinds" verwende, um damit herumzuspielen. –