2015-03-13 7 views
5

Manchmal möchte man vielleicht x als den gleichen Typ wie y deklarieren. Mit vals behandelt Inferenz dies sehr gut, aber dies funktioniert nicht in einigen anderen Bereichen, wie with function types.Warum Scala hat keinen Deklinktyp?

Eine Lösung, die einem Programmierer mit etwas C++ Erfahrung offensichtlich erscheint, wäre ein decltype. In der heutigen Scala scheint keine solche Einrichtung vorhanden zu sein.

eine Antwort auf die Fragen im Zusammenhang erzählt:

weil Typen

Bürger Klasse I sind diese nicht zuerst nicht verstehen, muss ich zugeben. Ich glaube nicht, dass Typen in C++ erstklassige Bürger sind, aber trotzdem kann es die decltype haben. Ich frage nicht nach etwas wie decltype für Typ-Parameter in Generika oder ähnliches (ich verstehe Generika sind keine Vorlagen und die Typen sind in ihnen gelöscht). Dennoch denke ich, dass ein Operator, der mir erlauben würde, einen Typ eines Ausdrucks an einer Stelle zu verwenden, an der ein Typ erwartet wird - sicherlich muss der Compiler einen Ausdruckstyp auswerten können, andernfalls wäre eine Inferenz für die val Definition nicht möglich.

A decltype könnte wie unten verwendet werden - der Code nichts, etwas Sinnvolles, versucht, genau das zu tun, die Syntax und die Grundlagen zu erläutern:

case class A(x:Int = 0) 

val a = new A(10) 
val b = new decltype(a) 

def f(c:decltype(a)) : decltype(a.x+a.x) 

Ist Abwesenheit von decltype eine bewusste Entscheidung, oder gibt es einige spezifische Gründe, warum Scala es nicht haben kann? Gibt es vielleicht eine Lösung, die die Reflektion der Kompilierzeit nutzt, um dies zu ermöglichen?

+0

Wie 'b' hier ins Spiel kommen ? –

+0

@ m-z b ist hier nur ein Beispiel. In diesem speziellen Fall wäre es dasselbe wie val b = a, aber man kann sich leicht einen ähnlichen Fall vorstellen, in dem es nicht derselbe wäre. Ich werde versuchen, die Frage zu aktualisieren. – Suma

+0

Ich verstehe die Frage nicht. Typensignaturen sind die Kompilierzeit, daher müssen Sie den Typ statisch angeben können. Was gibt dir dann dieses 'declype'-Ding? Was ist der "Nachteil" des regulären "val b: A = a" und "def f (c: A): A"? –

Antwort

1

Mein erster Stich:

class Decl[T] { type Type = T } 
object Decl { def apply[T](x: T) = new Decl[T] } 

Zum Beispiel, wenn wir einige Variable x deren Art wir nicht explizit angeben wollen:

val d = Decl(x) 
type TypeOfX = d.Type 
+0

Das ist wirklich nett. Es ist schade, dass man 'Decl (x) .Type' nicht direkt schreiben kann (oder zumindest habe ich keinen Weg gefunden), aber immer noch nett, es macht den Job. – Suma

+0

Ich denke, dies zeigt, dass das Fehlen von etwas wie "Decltype" in Scala höchstwahrscheinlich eine bewusste Entscheidung ist. – Suma

Verwandte Themen