2016-04-18 17 views
0

Angenommen, ich habe eine Funktion in der folgenden Weise definiert:Scala: in Abhängigkeit vom Typ Argumente Loswerden

def fun[T](somevar: SomeType[T]) = { 
    // some action 
} 

Gibt es eine Möglichkeit [T] loswerden vom Typ Parameter git und es nur als

verwenden
def fun(somevar: SomeType[T]) = { 
    // some action 
} 

Ich meine, die Typinformationen sollten bereits innerhalb someVar, nein verfügbar sein? Warum benutzt du sie nicht irgendwie?

+0

Möchten Sie nur die zusätzlichen Zeichen eingeben, wenn Sie die Funktion definieren? Oder hoffen Sie, etwas anderes zu gewinnen? –

+0

Nun, als Programmierer ist es kein Problem; Das Problem ist, dass wir eine Scala-basierte Sprache für Benutzer erstellen (die keine Scala-Programmierer sind), um sie zu benutzen; Aus diesem Grund versuchen wir, es für Nicht-Scala-Benutzer so einfach wie möglich zu machen. – Daniel

+0

Was ich meinte war, gibt es andere Situationen, die Sie mit dieser Änderung verbessern möchten, außer der Art, wie der Funktionsname geschrieben wird, wenn er definiert wird?Vielleicht ein Code, wenn es aufgerufen wird, oder etwas anderes? –

Antwort

1

Es sei denn, Sie wollen T einen bestimmten Typ sein, nein, gibt es nicht. Die Methodensignatur wäre ohne sie nicht gültig. Was somevar weiß, ist irrelevant.

0

Sie können dies nicht tun. Compiler muss wissen, was Typ T ist. Wenn Sie nicht über SomeType Typ Parameter ist es egal, können Sie dieses Formular verwenden:

def fun(somevar: SomeType[_]) = { 
    // some action 
} 
2

Diese problematisch sein würde, weil, was Sie entfernen nie wirklich überflüssig war. Wenn die Funktion als def fun[T](...) definiert ist, wird T als neue Typvariable definiert. Ansonsten bezieht es sich auf eine Typ- oder Typvariable, die an anderer Stelle definiert wird. Sie scheinen zu glauben, dass

def fun(somevar: SomeType[T]) { ... } 

bedeuten soll, dass T ist eine neue Art Variable. Ist das aber immer so? Nicht in diesem Code:

trait T { ... } 
def fun(somevar: SomeType[T]) { ... } 

Wohin gehen wir dann von dort? Definieren Sie neue Typvariablen immer dann, wenn auf einen Typnamen verwiesen wird, der vorher nicht definiert wurde? Das würde die folgenden Kompilierfehler wirklich komisch machen. (Oder noch schlimmer, manchmal erlauben, sie zu kompilieren?)

def fun(somevar: SomeType[Integr]) { ... } 

class C[Thing] { 
    def g(x: List[Think]) = ... 
} 

Für die Kompilierung-Typ-checking Philosophie der Scala, auf diese Weise liegt Wahnsinn.

3

Der Zweck Ihrer Frage ist unklar.

Die Benutzer Ihrer Funktion (der Client-Code) müssen sich nicht um den Typparameter kümmern. Sie können einfach anrufen.

Wenn der Typ T auf den Körper von fun() immateriell ist, dann kann es fällt gelassen werden: SomeType[_]

Aber wenn T sinnvoll ist, um die Funktionsweise der Funktion dann der Compiler gesagt werden muss, dass es sich um einen Typ-Parameter ist . Wenn man dies sieht, SomeType[T], kann der Compiler nicht schließen, dass T jetzt ein Typparameter ist. Stattdessen wird nach einer Definition von T außerhalb von fun() gesucht. Wenn Sie sie nicht finden, wird ein Fehler ausgegeben.

Verwandte Themen