2013-09-27 16 views
8

Więc dla bardzo małej wzoru interpretter ktoś poprosił mnie o code-golf, chciałem zrobić coś takiegoOperatorzy jak literały funkcyjnych

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

aby umożliwić szybką konwersję pomiędzy słowami kluczowymi i opisują funkcje. Nie tylko ta składnia nie była analizowana, ale nie została wypróbowana żadna inna skrócona składnia, którą próbowałem (_ + _, _:Int.+_). Czy istnieje sposób, aby to zrobić jako skrót funkcyjny, czy też jestem skazany na pełne wypisywanie lambd, rujnując mój wynik w golfa.

Edycja: Problemem były tylko liczby całkowite. Rozumiem, że przeciążenie spowodowałoby to znacznie trudniejsze inaczej.

+2

jedynym sposobem wiem, byłoby 'ops val = mapa [String (Int, Int) => Int] ("plus" -> (_ + _), "minus" -> (_ - _)); 'To nie oszczędza zbyt wiele postaci ... Jestem ciekawy, co zasugerują bardziej doświadczeni/mądrzejsi ludzie. :) –

+0

@ PatrykĆwiek jeśli OP chce ogólnego podejścia do dowolnej wartości, lambda nie pomoże, ponieważ te operacje są przeciążone – 4lex1v

+0

@AlexIv Prawda, to specjalizacja. Założę się przez adnotację '_: Int' w pytaniu, że proste' (Int, Int) => Int' będzie wystarczające. Jeśli to ogólne pytanie, to nie mam pomysłów. :) –

Odpowiedz

5

Nie wiesz, jak wpływa na wynik, definiując dodatkową funkcję. Można podnieść operatorów, za pomocą czegoś takiego:

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

A jeśli chcesz się golić kilka znaków:

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

I jako komentarze om-nom-nom, to wyraźne podnoszenie może być wykonywane przez kompilator, jak również poprzez zapewnienie podpis typu do coerse podnoszenia:

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

Nie jest dużo lepszy niż 'val ops: Map [String, (Int, Int) => Int] = Map (" plus "-> (_ + _)," minus "-> {_-_}, "times" -> {_ * _}, "div" -> {_/_}) '(albo() lub {} nawiasy klamrowe) –

+0

@ om-nom-nom tak, jechałem samochodem Powrót do domu myślenia ... Podnoszenie metody odbywa się automatycznie przez kompilator i zdał sobie sprawę, że potrzebuje tylko podpis typu. – maasg