# Funktionen vs Methods in Scala



## Spin (24. Okt 2011)

Hallo liebe Community,

mein Studium fängt wieder an und so langsam muss ich mich wieder mit Scala auseinandersetzen.
Mit Hilfe eures Wissens bin ich schon einen immensen Schritt voran gekommen, aber ich habe nach wie vor Probleme mit funktionaler Programmierung.

Zwar programmiere ich seit langen Javascript und kenne da Curring , Closures, higher functions ...benutzt man ständig. 

Aber was zu Hölle mein Scala mit Methode und Functions.

def simpleFunction(x:Int) : Int = x+y

Das ist eine Funktion!


Wenn ich das nun in einer klasse definieren und nicht in einem Modul (object), dann heißt das Methode?

class Person {

def nameExitsts(text:String) : Boolean = if (text) ; true
}


Eine Methode gehört einem Objekt an und kann dann mit Object.methode aufgerufen werden?
Ich bitte um Hilfe, vielen Dank .)


----------



## 0x7F800000 (24. Okt 2011)

Spin hat gesagt.:


> Mit Hilfe eures Wissens bin ich schon einen immensen Schritt voran gekommen, aber ich habe nach wie vor Probleme mit funktionaler Programmierung.


Echt? Ist aus dem Vortrag was geworden? Hab's irgendwann nicht mehr so ganz genau mitverfolgt, sorry^^



> Aber was zu Hölle mein Scala mit Methode und Functions.


Methoden sind dasselbe, wie in Java: die hängen an instanzen von Objekten herum, und tun irgendwas:

```
class X{
  def dasIstNeMethode(...):Int = { hier darf man auf andere member von X zugreifen }
}

object O{
  def dasIstAuchEineStinknormaleMethode(){
    // nur hängt die an einer instanz einer singleton-klasse
  }
}

package object mypackage{
  // das ist eigentlich wieder eine methode, nur soll sie den anschein erwecken
  // "einfach so im package rumzuschweben" und an kein Objekt gebunden zu sein.
  // Sie sollte in den seltensten Fällen auf Member-Variablen des package-objektes zugreifen
  def myMethod(x: Int ) = x * x
}
```

"Funktionen" dagegen sind keine Methoden, sondern Instanzen der Klassen [c]Function1[-X, +Y][/c], [c]Function2[-X1, -X2, +Y][/c] etc. Von der JVM werden sie wie stinknormale Klassen gehandhabt, das könnte man alles in Java 1:1 genauso hinschreiben. Der Unterschied besteht darin, dass Scala für solche Klassen eine extrem kompakte Syntax zur Verfügung stellt. Erstens: Diese Klassen implementieren Methoden [c]apply(x: X): Y[/c] bzw [c]apply(x1: X1, x2: X2): Y[/c], und deswegen kann man beispielsweise kurzerhand [c]f(5)[/c] schreiben, wenn [c]f[/c] vom Typ 
	
	
	
	





```
Function1[Int, Int][/c] ist (denn apply-methode muss nicht ausgeschrieben werden, klammer reichen). Das funktioniert übrigens mit allen Klassen, die [c]apply[/c] impementieren. Zweitens: bei Java müsste man jedes mal eine furchterregende Wurscht der Gestalt
[code=Java]
Function<Int, Int> square = new Function<Integer, Integer>(){
  @Override 
  public Integer apply(Integer x){
    return x*x;
  }
};

Function<Int,Boolean> predicate = new Function<Integer, Boolean>(){
  @Override
  public Boolean apply(Integer x){
    return x>5;
  }
}
```
hinschreiben. Da Scala sich als Funktionale Sprache versteht, ist sowas natürlich völlig unerträglich, deswegen gibt es für die Erzeugung von Function-Instanzen eine wesentlich kompaktere Syntax mit [c]=>[/c]:

```
val sq = (x: Int) => x * x
val predicate = (x: Int) => x > 5
```
Oder noch kürzer (bei parametern, die man nur ein einziges mal verwenden muss):

```
val predicate2 = (_: Int) > 5
```
Oder noch kürzer, wenn man von der Typinferenz gebrauch macht:

```
myIntegerList.filter(_ > 5) // filtert zahlen größer fünf heraus
```

Nochmal: das ist im wesentlichen äquivalent zu Java-Analogon:

```
myIntegerList.filter(new Function<Int, Boolean>(){
  @Override
  public Boolean apply(Integer i){
    return i > 5;
  }
}
```
nur bei weitem nicht so brutalst aufgebläht.

Der wesentliche Unterschied: Man kann Funktionen als Parameter übergeben (weil es ja nur stinknormale Instanzen, wie Integer und Strings sind), Methoden dagegen kann man nur definieren, annotieren, dokumentieren und aufrufen, sonst nichts. Aber sogar dieser feine Unterschied ist für Anfänger manchmal schwer zu erkennen, weil man methoden schnell zu funktionen closure'n kann, und funktionen selbstverständlich in der methoden-deklaration aufrufen kann. 



> def simpleFunction(x:Int) : Int = x+y
> 
> Das ist eine Funktion!


Nö. Das ist eine Methode von irgendetwas.


----------



## 0x7F800000 (24. Okt 2011)

Wieso musst du dich denn wegen der Uni mit Scala beschäftigen? Bzw. was für eine Uni ist das?


----------



## Spin (25. Okt 2011)

Moin, ich schaue mir morgen deine Antwort genauer an und vielen lieben dank dass du mir wieder weiter hilfst.

Ich studiere an der Uni Lübeck und dort belege ich das Fach Programmiersprachen und Algorithmendesign. In beiden Fächern wird lediglich in Scala programmiert.

Ich kann nicht jeden Tag an Scala arbeiten, daher kommen meine Fragen immer Step by Step und manchmal schaffe ich es nicht gleich gute Antworten auszuwerten 

Ich arbeite nebenbei als PHP und Javascript Entwickler und Java + Scala lediglich im Studium. Weiter schreibe ich Treiber in C für Infrarot und Bleutooth, Wireless Lan.

Das nimmt alles viel Zeit in Anspruch....mein English ist halt nicht so gut und ich vertehe somit teilweise nicht alle Artikel die es so im Netz gibt. Es gibt zahlreiche Artikel die mir den Unterschied erklären( Funktionen vs. Methods) aber keiner ist mal kurz und knapp auf den Punkt gebracht 

OOP und przedural + pseudo funktional in javascript .... alles easy..... aber warum ich mich Scala so schwer tue , weiss ich nicht---- vielleicht weil ich noch nie richtig gecoded habe. 

Meine Eclipse IDE packt rum mit Scala und das macht halt kein Bock 
Vorallem ist Scala ein Mischmasch aus 100 Sprachen (semantisch und Syntaktisch) , was echt sehr anspruchsvoll ist.

Naja ich arbeite weiter dran und PS: Mein Vortrag habe ich noch nicht gehalten 
Kommt noch... ich mache Sonntag die Folien fertig ( ja......so trödel ich rum ) ^^ .... und schicke dir die denn mal ---- hoffe nicht alles ändern zu müssen 

Vielen dank, dass du mich so unterstützt.

grüße Spin


----------



## 0x7F800000 (25. Okt 2011)

Spin hat gesagt.:


> Ich studiere an der Uni Lübeck und dort belege ich das Fach Programmiersprachen und Algorithmendesign. In beiden Fächern wird lediglich in Scala programmiert.


Geil!



> aber warum ich mich Scala so schwer tue , weiss ich nicht---- vielleicht weil ich noch nie richtig gecoded habe.


Programmieren lernt man nur durch programmieren. Scala lernt man nur durch programmieren von großen Bibliotheken, erst da wird deutlich, wozu Odersky sich das alles ausgedacht hat. Bei Hello-World-For-Int-I-Printl kommt das nicht so richtig zum tragen.



> Vorallem ist Scala ein Mischmasch aus 100 Sprachen


Naja, nöö... Java, Haskell, ML, und das war's eigentlich schon. XML-Unterstützung ist gehört ja nicht wirklich zum unumgänglichen Sprachkern, den jeder braucht. Und es ist _inspiriert_ von den Sprachen, es ist kein "Mischmasch", sondern mit abstand die am weitsichtigsten und akkuratesten entworfene Sprache, die ich kenne  



> und schicke dir die denn mal ---- hoffe nicht alles ändern zu müssen


Nja, kannst du zwar machen, aber ich werde mir nicht viel Zeit dafür nehmen können, ich werd's höchstens durchblättern. Semester hat begonnen, sorry...


----------



## escalate (29. Okt 2011)

Spin hat gesagt.:


> Ich studiere an der Uni Lübeck und dort belege ich das Fach Programmiersprachen und Algorithmendesign. In beiden Fächern wird lediglich in Scala programmiert.


Interessant zu hören, wo es noch Scala-Nester an den Unis gibt. 

Ich weiß von Leuten an der Uni Bayreuth, in Würzburg und an der Beuth-Hochschule in Berlin, da wir alle an einem Scala-Projekt arbeiten.
In Bayreuth hier hatten wir letztes Semester die erste Vorlesung "Funktionale Programmierung (mit Scala)". Bei uns haben immerhin die fast alle Informatik-Master schonmal Scala gesehen und das ist doch ganz gut so.



> Naja ich arbeite weiter dran und PS: Mein Vortrag habe ich noch nicht gehalten
> Kommt noch... ich mache Sonntag die Folien fertig ( ja......so trödel ich rum ) ^^ .... und schicke dir die denn mal ---- hoffe nicht alles ändern zu müssen


Kannst mir auch mal schicken, bei mir hat zwar auch das Semester begonnen, aber dafür müsste ich noch etwas Zeit finden


----------



## 0x7F800000 (29. Okt 2011)

escalate hat gesagt.:


> In Bayreuth hier hatten wir letztes Semester die erste Vorlesung "Funktionale Programmierung (mit Scala)".


Ich blick da nicht durch: Ecological Modelling: Staff. Erstens verstehe ich nicht, wie jemand gleich 8 Veranstaltungen pro Semester halten/betreuen soll, zweitens finde ich in dieser Liste nirgends "Funktionale Progammierung", obwohl's hier https://qis-lsf.uvw.uni-bayreuth.de/qisserver/rds?state=medialoader&application=lsf&objectid=164 drinsteht ???:L Wer hat's denn nun gehalten?


----------



## escalate (29. Okt 2011)

0x7F800000 hat gesagt.:


> Ich blick da nicht durch: Ecological Modelling: Staff. Erstens verstehe ich nicht, wie jemand gleich 8 Veranstaltungen pro Semester halten/betreuen soll


Keine Ahnung wie die Beteiligung bei den anderen Veranstaltungen war, aber die Funktionale Programmierung hat Baltasar alleine gehalten.

Weiß auch nicht, warum das nicht auf der Seite steht, vielleicht um die Geoökologen nicht zu verwirren.  
Für die sind die Veranstaltungen bestimmt und vielleicht noch für die 1-2 Umweltinformatiker pro Jahrgang, die hin und wieder vorhanden sind 

Ich hoffe mal, dass die FP-Vorlesung kein Einzelfall bleibt, im Modulhandbuch steht es als "zeitweilig angeboten".


----------



## 0x7F800000 (29. Okt 2011)

escalate hat gesagt.:


> Keine Ahnung wie die Beteiligung bei den anderen Veranstaltungen war, aber die Funktionale Programmierung hat Baltasar alleine gehalten.


Okay... Den Menschen merk ich mir mal, der hat wenigstens Erfahrungen damit gesammelt, wie sich Scala auf Studenten in solchen Vorlesungen auswirkt, den könnte man bei aufkeimenden Diskussionen zu diesem Thema ggf. mal anschreiben und fragen, wie es so war^^ 



> Ich hoffe mal, dass die FP-Vorlesung kein Einzelfall bleibt, im Modulhandbuch steht es als "zeitweilig angeboten".


Was ich nicht verstehe: an meiner Uni gibt es doch auch Profs, die sich mit Compilerbau befassen, und sich für ästhetische neue Programmiersprachen interessieren sollten. Wo schauen sie denn alle hin? :bahnhof:


----------



## Landei (1. Nov 2011)

Dürfte ich ein wenig Eigenwerbung betreiben?

Methoden und Funktionen  eSCALAtion Blog


----------

