Hai mai usato il visitatore o modelli di strategia, fabbriche o iniezioni di dipendenza? Hai mai passato o richiesto un oggetto di tipo Runnable
o Comparator
? Tutte queste cose sono hack ad hoc in cui manca la capacità di passare le funzioni.
Nel modello di visitatore , invece di avere accept
ricevere un'interfaccia per un visitatore, si prende una funzione Element => Unit
invece (per il caso di ritorno del vuoto). Il concetto generale di visitatore è noto come catamorfismo , di cui ogni tipo di mappatura e piega sono casi speciali di
Nel schema di strategia , l'interfaccia della strategia è solo una funzione. Nell'esempio wiki, sostituisci l'interfaccia con (Int, Int) => Int
.
Nel schema dei metodi di fabbrica , l'intera classe di fabbrica è una funzione. Nell'esempio dell'incapsulazione wiki, ImageReaderFactory
è solo una funzione (InputStream) => ImageReader
.
A Runnable
è solo una funzione () => Unit
. Un Comparator
è solo una funzione (A, A) => Int
. Potrei andare avanti e avanti e avanti con questo, ma basti dire questo: hai passato le funzioni come argomenti per tutto questo tempo, solo nel modo più difficile.
Per quanto riguarda la tua ultima domanda, non capisco molto bene cosa intendi. Una funzione, in Scala, è un oggetto che implementa l'interfaccia FunctionN
, dove N
rappresenta l'arità. Naturalmente, i linguaggi non orientati agli oggetti non sono vincolati a rappresentare funzioni come oggetti. Infatti, anche i linguaggi object oriented non sono vincolati a questo - un int
in Java non è un oggetto, quindi perché dovrebbe una funzione?