2012-04-04 17 views
18

Ich habe eine Funktion, die ich ziemlich häufig benutze, die mir erlaubt, meinen Code in einer Weise zu schreiben, die mir natürlicher erscheint.Haskell funktioniert von links nach rechts

infixl 6 $: 
($:) :: a -> (a -> b) -> b 
a $: f = f a 

Dies lässt mich wie etwas tun

let x = getData 
     $: sort 
     $: group 
     $: aggregate 

statt

let x = aggregate 
     $ group 
     $ sort 
     $ getData 

ich vor kurzem erfahren, dass Clojure so etwas wie dies in (ich weiß nicht viel Clojure gebaut hat, aber Ich denke, es würde (-> getData sort group aggregate) geschrieben werden?) Das lässt mich fragen, ob Haskell es auch eingebaut hat. Hoogle doesn't have any results obwohl.

Gibt es Standard-Bibliotheken mit etwas ähnliches enthalten? Es macht wahrscheinlich meinen Code schwer für andere zu lesen, wenn ich einen solchen gemeinsamen Teil habe, ist idiosynkratisch.

+5

Meine Präferenz ist diese Operation '#' per OOHaskell zu nennen, da es im Grunde der gleiche Vorgang wie Methodenauswahl auf Objekte und die '#' ist der Betreiber dafür verwendeten in OCaml. Alternativ können wir # # auch kopieren, indem wir '|>' –

+1

Diagramme verwenden. – Long

+1

Es gab einen Vorschlag für die Einführung von 'flip ($)' in Data.Function, aber es wurde fallengelassen, weil kein Konsens darüber erzielt werden konnte, ob so etwas nützlich wäre (im Gegensatz zu Anfänger verwirren etc.). Hier ist die Diskussion: http://markmail.org/message/vsplpb7aajp7goqo?q=python – David

Antwort

22

Es gibt nichts Vergleichbares gebaut, aber Control.Category.(>>>) liegt in der Nähe: es ist flip (.), so dass Sie

f x = x $: sort $: group $: aggregate 

als

f = sort >>> group >>> aggregate 

Es no shortage of definitions and names ist für Ihre ($:) combinator schreiben kann. Ich denke, dass Funktionen eher dem Pipeline-Stil als einfachen Anwendungen entsprechen, so dass ich kein großes Bedürfnis danach verspüre; (>>>) ist allerdings ein bisschen hässlich.

(Außerdem Haskells nicht-strenge Semantik bedeutet, dass der Datenfluss nicht notwendigerweise in die Richtung ist, die Pfeile zeigen hier, denn immerhin aggregate den ersten Konstruktor bereitstellen könnte, bevor sort sogar eine Chance bekommt, auf die aussieht . Argument so neige ich dazu nur (.) und ($) zu verwenden; ich der Ordnung gewöhnt bin)

+2

Hässlich oder nicht Ich denke (>>>) ist intuitiv, weil es aussieht (>> =), was eine ähnliche Links-nach-Rechts-Pipeline ist. – amindfv

+0

Schade, es ist 'flip (.)' Anstelle von 'flip ($)'. Aber ich denke, '>>>' ist so nah wie möglich. – Xodarap

+0

Es gibt auch (#) von http://hackage.haskell.org/packages/archive/diagrams-lib/0.4.0.1/doc/html/Diagrams-Util.html, aber es hat eine weit andere Infix-Priorität als ($). – mgsloan

3

der umgekehrte Anwendung Operator Ihren beschreiben, ist jetzt Teil des Standardpakets base (seit 4.8.0) als & operator..

Beachten Sie, dass dieser Operator mit einer niedrigeren Priorität als der von Ihnen vorgeschlagene definiert ist (infixl 1).

Verwandte Themen