2012-02-03 7 views
21

Mi piacerebbe leggere di più sull'operatore -> di haskell. Non sono molto chiaro su quanto offusca la linea tra sintassi speciale e una sorta di classe di tipo, e mi piacerebbe fare un po 'di scherzi. cose Specificalyl, ho visto come questo:Dove posso leggere sull'operatore haskell "->"?

instance Monad ((->) r) where ... 

che hanno suscitato il mio interesse.

Tuttavia, quando provo a cercare "haskell arrow" o "haskell function" o "haskell class function", mi imbatto negli ovvi problemi di ottenere risultati per Control.Arrow o semplici tutorial di classe tipo.

Cosa viene chiamato -> e dove posso leggere di più?

+2

Nota: che dovrebbe essere 'istanza Monad ((->) r)'. '(->)' accetta due argomenti di tipo, mentre 'Monad' è per i tipi che ne prendono uno solo, quindi è necessario applicarlo parzialmente. – hammar

risposta

27

(->) è spesso chiamata la "funzione di freccia" o "tipo di funzione di costruzione", e mentre ha alcuni sintassi speciale, non c'è che molto speciale.

È essenzialmente un operatore di tipo infisso. Dagli due tipi e ti dà il tipo di funzioni tra questi tipi. Proprio come 2 + 3 è zucchero sintattico per (+) 2 3, quindi è from -> to zucchero sintattico per (->) from to. Puoi pensare ad esso come Function from to se i simboli sono confusi.

In altre parole, l'istanza lei ha citato può essere letta come

instance Monad (Function from) where ... 

che rende chiaro che stiamo parlando di funzioni che accettano argomenti di alcuni arbitraria (ma fissa) tipo. In effetti, questa istanza monad si trova in Control.Monad.Instances ed è essenzialmente la stessa di the Reader monad.

Guardando the source, è davvero molto semplice:

instance Monad ((->) r) where 
    return = const 
    f >>= k = \ r -> k (f r) r 

I valori banali fornite dal return ignorano l'argomento, e l'operatore (>>=) distribuisce l'argomento r su entrambi i lati.

È inoltre interessante notare che nel corrispondente Applicative esempio per funzioni, pure e (<*>) corrispondono ai combinatori K e S di the SKI combinator calculus.

(->) è anche generalizzato dal Arrow type class. Introduzione alle frecce can be found here.

Infine, notare che il simbolo -> appare anche in altre parti più o meno estranee della sintassi, incluse le astrazioni lambda \x -> ..., le espressioni di caso case ... of x -> ..., ecc.Il simbolo di inversione <- si verifica anche in diversi contesti non correlati. Non confondere quelli con la freccia funzione.

+1

Ottima risposta, come sempre. Si potrebbe obiettare, tuttavia, che le espressioni -> in lambda sono più legate all'operatore di tipo di quanto si possa pensare. E, naturalmente '(\ a -> b) c' è' caso c di a -> b' e viceversa. – Ingo

0

Penso che sia chiamato la freccia. Secondo "Real World Haskell":

-> ha un solo significato: si denota una funzione che prende un argomento del tipo a sinistra e restituisce un valore del tipo a destra.

+1

Questo è in tipo firme, ma OP parla di una funzione – amindfv