2014-11-21 8 views
6

eine Funktion für Infix Nutzung Gegeben:`flip` Argumente von Infix Anwendung Inline

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

Die Argumente können durch die Definition einer Hilfsfunktion umgedreht werden:

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

Ist es möglich, diese Inline zu tun ?

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

Mein ist Use Case Control.Arrow.first. Statt

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

würde ich eine zukunftsanwendungs ​​Stil Lösung wie

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

, ohne dass es vorziehen,

let forwardFirst = flip first 
+1

Was ist Ihr Anwendungsfall, um dies zu tun, da Sie bereits 'g' definiert haben? –

+2

Ich habe gerade meinen Anwendungsfall hinzugefügt. :) –

+1

Dies ist keine direkte Antwort auf Ihre Frage, aber Sie können es als '(7,8) & _1% ~ (+10)' mit Objektiv schreiben. Natürlich können Sie einfach '&' verwenden und es als '(7,8) & first (+10)' schreiben. Ist das etwas, was du willst? – snak

Antwort

1

Wie in den HaskellWiki article on infix operators ausführlich zu schreiben,

Beachten Sie, dass Sie dies normalerweise nur tun können ist mit einer Funktion, die zwei Argumente dauert. Eigentlich für eine Funktion mehr als zwei Argumente nehmen, Sie können es tun, aber es ist nicht annähernd so schön

Die Art und Weise dies in Ihrem Fall zu tun wäre, so etwas wie dieses:

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

Mit 'g = flip f' und' h a b = (f 'flip' a) b' sind beide Funktionen gleich. Wo liegt der Vorteil der komplizierteren Version 'h'? –

+0

Messezeitpunkt. Ich bin mir nicht wirklich sicher, ob es eine bessere Möglichkeit gibt, das zu tun, was Sie wollen. –