2009-11-11 7 views
10

Il tipo della funzione flipPrelude è:È possibile utilizzare la funzione unaria invece di binario in `flip`?

flip :: (a -> b -> c) -> b -> a -> c 

cioè ci vuole una funzione binaria e due argomenti.

Il tipo della funzione idPrelude è:

id :: a -> a 

Ma il tipo di flip id è:

flip id :: a -> (a -> b) -> b 

Come è possibile applicare flip-id quando id è una funzione unaria e flip richiede la funzione binaria per il primo argomento?

btw. flip id è simile a \ x f -> f x

risposta

15

Haskell rende id adattarsi al tipo del primo argomento flip modificando a = b -> c. Quindi:

flip :: (a  -> b -> c) -> b -> a  -> c 
flip :: ((b -> c) -> b -> c) -> b -> (b -> c) -> c 
flip id ::      b -> (b -> c) -> c 

dove id è preso ad essere di tipo

id :: (b -> c) -> b -> c 

che equivale a

id :: (b -> c) -> (b -> c) 

cioè una specializzazione di id che si applica solo a funzioni unari.

Edit: Penso che potrei riformulare la mia prima linea come: deduce
Haskell che id si adatta al tipo del primo argomento a flipsea = b -> c.
Nel caso sia più chiaro.

+0

ho dimenticato che il tipo di identificatore generale 'a' può essere una funzione anche, grazie. –

4

Nefrubyr lo spiega molto bene.
Un altro modo per (si spera) renderlo un po 'più intuitivo è pensare all'operatore dell'applicazione di funzione ($).

($) è una forma specializzata di id:

($) :: (a -> b) -> (a -> b) 
($) = id 

Ho visto la definizione (#) = flip ($), in modo tale che è possibile scrivere l'argomento prima della funzione propria applicato a: obj # show.

Ovviamente, dal momento che ($) è solo una forma specializzata di id, si potrebbe anche scrivere: (#) = flip id

Problemi correlati