2013-06-10 5 views
10

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.

+5

Können Sie mehr über die Struktur beschreiben Sie haben, und was insbesondere Ursachen es das Fusionsgesetz zum Scheitern verurteilt für 'fmap'? – luqui

+2

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

+0

@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. –

Antwort

3

Nun, hier ist ein Gesetz, das Sie nur mit unit und join haben sollten. Bei x :: m a,

join (unit x) = x 

Um zu zeigen, dass dies nur aus dem Nichts kam nicht, lassen Sie sich mit einem bestehenden Monade Gesetz beginnen:

return x >>= f = f x 

Da m >>= f = join (fmap f m)

join (fmap f (return x)) = f x 

Wählen Sie f = id

join (fmap id (return x)) = id x 

die Funktors Gesetz verwenden, die fmap id = id

join (id (return x)) = id x 

Verwenden Sie die offensichtliche id a = a

join (return x) = x