2017-11-08 4 views
9

war ich ein bisschen überrascht, als ich den Quellcode von Instanzen von Applicative Complex und Monad Complex von GHC Data.Complex Modul lesen:Bedeutung und Verwendung von komplexen Zahlen funktor und monad?

-- | @since 4.9.0.0 
instance Applicative Complex where 
    pure a = a :+ a 
    f :+ g <*> a :+ b = f a :+ g b 
    liftA2 f (x :+ y) (a :+ b) = f x a :+ f y b 

-- | @since 4.9.0.0 
instance Monad Complex where 
    a :+ b >>= f = realPart (f a) :+ imagPart (f b) 

Was zum ...? Die Applicative Complex Instanz scheint komplexe Zahlen nur als Größe-2-Arrays zu behandeln. Und beide scheinen eher Pfeiloperationen zu sein. Gibt es eine mathematische Grundlage dahinter? Entweder gibt es oder nicht, wofür werden sie verwendet?

+0

Sie sind gesetzestreue Instanzen, es gibt also keinen Grund dafür, dass sie nicht existieren (dies ist die 'mathematische' Basis). – user2407038

+0

Also gibt es keine Verbindungen zu komplexer Analyse und komplexe Zahlen sind nur Größe-zwei-Arrays hier? –

+0

Komplexe Zahlen * sind * in gewissem Sinne nur Arrays der Größe 2. ℂ ist isomorph zu ℝ². – chepner

Antwort

8

Bearbeitet zum Hinzufügung der Notiz unten re: "lineares" Paket.

Die Instanzen wurden gemäß dieser Trac 10609 ticket initiiert von hinzugefügt, wo Fumiaki Kinoshita anmerkte, dass einige fehlende Instanzen in den Basisbibliotheken nur in einer Weise definierbar zu sein schienen, und schlug einen Patch vor, um sie hinzuzufügen.

Soweit ich sehen kann, gab es keine mathematische Motivation sie für das Hinzufügen, obwohl zumindest gibt es eine mathematisch sinnvolle Operation, die applikativ ausgedrückt werden kann, nämlich Skalarmultiplikation:

> pure (*) <*> pure 2 <*> (3 :+ 4) 
6 :+ 8 
> 

In einem follow-up auf dem Über dem Mailinglisten-Post merkte Edward Kmett an, dass er dafür war, weil er seit Jahren für sein linear Paket verwaiste Instanzen für Complex hinzufügen musste, um die fehlenden Instanzen auszugleichen.

Es sieht so aus, als ob er sie für die Definition einer Additive Instanz für Complex nützlich fand, womit ein Complex ein Spezialfall eines zweidimensionalen Vektors ist.