2013-09-27 14 views
8

Also für eine sehr kleine Formel interpretter fragte mich jemand, um Code-Golf, ich so etwas wieOperatoren als Funktionsliteralen

val ops = Map("plus" -> + , "minus"-> -, "times"-> *, "div" -> /) 

zu ermöglichen schnelle Konvertierung zwischen Keywords und den Funktionen, die sie beschreiben, tun wollte. Diese Syntax wurde nicht analysiert, aber keine der anderen Kürzel-Syntaxen, die ich versuchte (_ + _, _:Int.+_), wurde analysiert. Gibt es eine Möglichkeit, dies als eine Funktion Kurzschrift zu tun, oder bin ich dazu verdammt, die Lambdas vollständig zu schreiben, ruinieren meine Golf-Score.

Edit: Das Problem in Frage war nur ganze Zahlen. Ich verstehe, dass eine Überlastung das sonst erheblich erschweren würde.

+2

der einzige Weg, ich weiß, wäre 'val ops = Map [String, (Int, Int) => Int] ("plus" -> (_ + _), "minus" -> (_ - _)); 'Das spart nicht zu viele Charaktere aber ... Ich bin gespannt, was erfahrenere/klügere Leute vorschlagen. :) –

+0

@ PatrykĆwiek, wenn das OP möchte einen allgemeinen Ansatz für jeden Wert, wird Lambda nicht helfen, weil diese Operationen überlastet sind – 4lex1v

+0

@AlexIv True, es ist spezialisiert. Ich habe mit der Anmerkung "_: Int" in der Frage angenommen, dass ein einfaches "(Int, Int) => Int" ausreichend ist. Wenn es eine allgemeine Frage ist, dann habe ich keine Ideen mehr. :) –

Antwort

5

Nicht sicher, wie Ihre Punktzahl beeinflusst wird, indem Sie eine zusätzliche Funktion definieren. Sie könnten die Betreiber heben, so etwas wie dies mit:

def lift(f:(Int,Int)=>Int) = f 
val ops = Map("plus" -> lift(_+_), "minus" -> lift(_-_), "times"-> lift(_*_), "div" -> lift(_/_)) 

Und wenn Sie einige Zeichen rasieren:

def ↑(f:(Int,Int)=>Int) = f 
val ops = Map("plus" -> ↑(_+_), "minus" -> ↑(_-_), "times"-> ↑(_*_), "div" -> ↑(_/_)) 

Und wie om-nom-nom Kommentare, diese explizite Aufhebung kann erfolgen durch der Compiler als auch durch die Art Unterschrift Bereitstellung der Hebe coerse:

val ops: Map[String, (Int,Int) => Int] = Map("plus" -> (_+_), "minus" -> (_-_), "times"->(_*_), "div" -> (_/_)) 
+2

Ist nicht viel besser als 'val ops: Map [String, (Int, Int) => Int] = Karte (" plus "-> (_ + _)," minus "-> {_-_}, "mal" -> {_ * _}, "div" -> {_/_}) '(entweder() oder {} geschweifte Klammern) –

+0

@ om-nom-nom ja, ich fuhr back home thinking ... Das Methodenlifting wird automatisch vom Compiler durchgeführt und erkennt, dass es nur die Typ-Signatur benötigt. – maasg