2013-08-31 14 views
10

ho questo codice:Scala, Passare un operatore come argomento di una funzione

for(i <- 0 to 8){ 
    ((numbers(i) - i)/3).abs + ((numbers(i) - i)%3).abs 
} 

e vorrei fare, come dice il titolo, qualcosa di simile

for(i <- 0 to 8){ 
    by3(numbers(i), i, /) + by3(numbers(i), i, %) 
} 

def by3(a: Int, b: Int, op: Int => Int) = ((a - b) op 3).abs 

e probabilmente anche utilizzare una funzione parzialmente applicata per questo ... ma ora sarebbe possibile ottenere? Come?

risposta

8

Per eliminare i trattini bassi è necessario definire le funzioni come valori.

val/= (a:Int, b: Int) => a/b 
val % = (a:Int, b: Int) => a % b 

def by3(a: Int, b: Int, fn: (Int, Int) => Int): Int = fn(a - b, 3).abs 

(0 to 8).foreach(i => by3(numbers(i), i, /) + by3(numbers(i), i, %)) 
+0

Questo è esattamente quello che stavo chiedendo, grazie :) – LowFieldTheory

+1

cool dal punto di vista di quanto sia flessibile la lingua, ma piuttosto oscuro da una prospettiva di manutenibilità del codice. Non lascerei entrare nel codice base. – maasg

6

A cura/Aggiornamento:

essere conciso, la via più breve per farlo è:

def doStuff(a: Int, b: Int, op: (Int, Int) => Int) = {op(a - b, 3).abs}

doStuff(4,1,_%_)

Così si può doStuff(numbers(i), i, _/_) + doStuff(numbers(i), i, _ % _)

+2

solo una cosa: questo è veramente dettagliato. Stavo cercando qualche piccola funzione per non duplicare un sacco di caratteri solo per un operatore, e sapere scala i era quasi sicuro di poter passare nella funzione solo% o /. Questa è in realtà una mezza risposta alla mia domanda, stavo cercando un metodo per passare direttamente un operatore, non creare due funzioni wrapper. – LowFieldTheory

+0

@Novalink, guarda il mio aggiornamento per favore. – tkroman

+0

Oh, ho modificato la risposta e ho notato che @maasg ha già pubblicato la soluzione. Ci scusiamo per il ronzio. – tkroman

16

primo luogo, è necessario definire correttamente op come una funzione (specificamente, a Function2)

def operate(a: Int, b: Int, op: (Int, Int) => Int) : Int = (op ((a - b), 3)).abs

operatori in Scala sono in realtà metodi: + è un metodo di Int (e lunga, doppia, ...) in Scala OO fondazione. Quindi, per passare un operatore (metodo) come funzione, è possibile sollevarlo utilizzando la notazione trattino basso: operate(5, 3, _ + _)

Problemi correlati