2014-11-21 14 views
6

data una funzione per l'uso infisso:`argomenti flip` di linea applicazione infisso

let f a b = (a+10, b) 
f 4 5 
=> (14,5) 
4 `f` 5 
=> (14,5) 

Gli argomenti possono essere capovolte attraverso la definizione di una funzione di supporto:

let g = flip f 
4 `g` 5 
=> (15,4) 

E 'possibile fare questo in linea ?

4 `flip f` 5 
=> parse error on input `f' 
4 `(flip f)` 5 
=> parse error on input `(' 

mio caso d'uso è Control.Arrow.first. Invece di

(+10) `first` (7,8) 
(17,8) 

io preferirei una soluzione-application-stile in avanti come

(7,8) `forwardFirst` (+10) 

senza bisogno di scrivere

let forwardFirst = flip first 
+1

Qual è il tuo usa il caso per voler fare questo, dato che hai già definito 'g'? –

+2

Ho appena aggiunto il mio caso d'uso. :) –

+1

Questa non è una risposta diretta alla tua domanda, ma puoi scriverla come '(7,8) e _1% ~ (+10)' usando l'obiettivo. Certo, puoi semplicemente usare '&' e scriverlo come '(7,8) e primo (+10)'. È qualcosa di simile a quello che vuoi? – snak

risposta

1

come dettagliato nella HaskellWiki article on infix operators,

Nota che puoi solo fare normalmente th è con una funzione che richiede due argomenti . In realtà, per una funzione di prendere più di due argomenti, si può fare ma non è altrettanto bello

Il modo per farlo nel tuo caso sarebbe qualcosa di simile:

let f a b = (a+10, b) 
let h a b = (f `flip` a) b 
let a = 3 
let b = 2 
f a b = (13,2) 
a `h` b = (12,3) 
+0

Con 'g = flip f' e' h a b = (f 'flip' a) b' entrambe le funzioni sono uguali. Dov'è il vantaggio della versione più complicata 'h'? –

+0

Punto giusto. Non sono sicuro se ci sia un modo migliore per fare ciò che vuoi. –