2013-09-01 13 views
15

In Haskell, was bedeutet ((->) t) in der Typ-Signatur von Instanzen? Zum Beispiel Functor, Applicative und Monad alle haben eine Instanz entlang der Linien von:Was bedeutet ((->) t) in Haskell?

Functor ((->) r) 

ich keine Erklärung, was diese Art Unterschrift bedeutet, und es ist sehr Suchmaschine beständig finden.

+3

'sehr suchmaschinen resistant' - nicht für die Suchmaschine SO. Siehe http://stackoverflow.com/q/5310203/11683 – GSerg

+1

Sie haben Recht! Ich denke, ich sollte manchmal überlegen, SO direkt zu suchen, anstatt mich nur auf Google zu verlassen. – drt

+0

Sie können auch nach [SymbolHound] (http://www.symbolhound.com/?q=Functor+%28%28-%3E%29+r%29) suchen. –

Antwort

19

-> ist ein Infix-Konstruktor. Sie können es mit : vergleichen - ein Infix-Wert-Konstruktor für Listentyp. Zur Nutzung : allein wir Klammern um es ausdrückte, so dass es eine Präfix Funktionsanwendung wird:

(:) a b ist die gleiche wie a : b

Ebenso ist (->) a b die gleiche wie a -> b, Art der Funktion a-b.

(->) a ist eine partielle Anwendung von Typkonstruktor und selbst ein Typkonstruktor der Art * -> *.

Sie können es sich als "ein Konstrukteur von Arten von Funktionen von a" vorstellen. Z.B. (->) Int ist ein Konstruktor von Arten von Funktionen von Int. Sie können den vollständigen Funktionstyp erstellen, indem Sie einen anderen Typ übergeben: (->) Int String ist der Typ der Funktionen von Int bis String.

instance Functor (->) a ist ein Funktors mit fmap Betrieb eine a -> b Funktion in eine a -> c Funktion transformieren. Sie können es mit einer ähnlichen instance Functor (Either a) vergleichen, die Either a b zu Either a c durch Anwendung der fmap Argument auf Right Werte.

+0

Danke. Das macht für mich meistens Sinn. Für Haskell ist es immer noch etwas Neues, also brauche ich einige Zeit, um es zu verdauen. – drt

+7

Die '(->) r'-Instanzen sind meiner Meinung nach * sehr * schwer zu verstehen. Ich bin relativ zuversichtlich mit viel Haskell, aber ich habe immer noch keine Ahnung, wie die '(->) r'-Instanzen funktionieren.Ich kann sie benutzen, weil ich sie die ganze Zeit benutze, also ist es für mich nicht mehr sonderbar. Ich würde nur nicht sagen, dass ich sie tief verstehe. Mach dir keine Sorgen, wenn Sie es auch nicht tun. Ich bin mir sicher, dass es uns beiden rechtzeitig erreichen wird. – kqr

+0

@kqr Wenn Sie wissen, was die Monad-Instanz tut, denke ich, dass Sie es auf eine nette Weise ableiten können. Diese kleine Notiz, die ich geschrieben habe, beginnt mit einer sehr ausführlichen (aber ich hoffe etwas leicht zu verstehen) Definition von '>> =' und zeigt dann, wie sie, wenn sie richtig Golf gespielt wird, identisch mit der üblichen Implementierung ist, die Sie von LYAH kennen beispielsweise. https://github.com/quchen/articles/blob/master/reader_instance_derived.md#bind – David

4

Sie könnten es als die Menge der Typen r -> a sehen, wo r fest ist.

Ein Funktor ist eine Typ-Funktion m, was bedeutet, dass Sie für jeden Typ a einen Typ m a haben. Beispiele sind Maybe, [] und (->) r. Letzteres sollte vielleicht besser geschrieben werden (r ->), aber ich weiß nicht, ob das erlaubt ist.

10

Wir konnten Lambda-Funktionen und Infix Funktionen nutzen:

(->) a = \b -> (->) a b --pseudo-Haskell 
(->) a = \b -> a -> b --pseudo-Haskell 

so, als Beispiel lesen:

class Functor f where 
    fmap :: (a->b) -> f a -> f b 

instance Functor ((->)r) where 
    fmap :: (a->b) -> f  a -> f  b 
     = (a->b) -> (->)r a -> (->)r b --pseudo-Haskell 
     = (a->b) -> (r -> a) -> (r -> b) --pseudo-Haskell 
+1

Das war eigentlich sehr hilfreich für meine Intuition. Ich muss das gleiche für die Anwendungsinstanz von '(->) r' tun! – kqr