2014-04-28 15 views
9

Ich weiß in Scala, können Sie type ===>[A, B] = Map[A, B] tun, und dann können Sie Infix-Notation verwenden, um def foo: String ===> Int zu definieren, die dasselbe ist wie sagen def foo: Map[String, Int]. Gibt es eine Möglichkeit, diese Infix-Notation zu nutzen, um Typen mit> 2 Argumenten zu erstellen? Zum Beispiel möchte ich etwas wie folgt aus:Scala-Infix-Aliasing für> 2 Typparameter?

type A ~> B ~~~> C ein Alias ​​von Map[A, Pair[B, C]] sagen zu sein?

Gibt es trotzdem kann ich etwas Zeile schreiben:

type A to B -> C als Alias ​​für (A, B, C) Typ?

Antwort

13

Interessanterweise operator precedence as defined for symbolic methods scheint nicht für symbolische Typ-Aliase zu halten. Stattdessen Infix Typ-Aliasnamen werden immer ausgewertet links assoziativ:

type -[A,B] = Map[A,B] 
type /[A,B] = Map[A,B] // '/' has higher precedence than '-' as an operator 
classOf[A - B/C] // Class[/[-[A,B],C]] 
classOf[A/B - C] // Class[-[/[A,B],C]] 

Leider bedeutet, dass es nie möglich sein wird, zu tun, was für Sie fragen ohne Klammern wie folgt aus:

classOf[A - (B/C)] // Class[-[A,/[B,C]] 

So ist die nächste Antwort ist die folgende :

type ~>[A,B] = Map[A,B] 
type ~~~>[A,B] = Pair[A,B] 
classOf[A ~> (B ~~~> C)] // Map[A,Pair[B,C]] 

die Klammern Ommitting wird nur möglich, wenn Sie mit der rechten assoziativen Aliase verwenden (mit : Endung)

type ~:[A,B] = Map[A,B] 
type ~~~:[A,B] = Pair[A,B] 
classOf[A ~: B ~~~: C] // Map[A,Pair[B,C]] 

Da leider alle Typ-Aliase den gleichen Vorrang haben, ist es nicht möglich, rechte und linke assoziative Aliase ohne Klammern zu mischen.

Betreffend den zweiten Teil Ihrer Frage: (A,B,C) ist syntaktischer Zucker für Tuple3[A,B,C], der ein Typ mit drei Parametern ist. Da Infix-Typen nur zwei Parameter haben, befürchte ich, dass es keine Möglichkeit gibt, diesen Typ nur mit Infix-Typen darzustellen. Sie würden immer mit verschachtelten zwei Parametertypen am Ende (zB (A,(B,C)) oder ((A,B),C).

+3

Große Klärung. Haben sie nicht, bis sie Ihre Antwort erkennen, dass die Priorität nicht das gleiche war! –

+0

Ist es möglich,' A wie B zu erreichen ~> C' bedeuten '(A, B , C) '? – pathikrit

+1

@wrick: Ich glaube nicht, dass das möglich ist le auf der Typenebene. Infix-Typen können nur zwei Typparameter annehmen, aber (A, B, C) drei. Nur ((A, B), C) oder (A, (B, C)) sind möglich IMHO. –

4

Kurze Antwort: Nein. A ~> B ~> C kann nicht bedeuten Map[A, Pair[B, C]].

Es könnte auch Map[A, Map[B, C]], oder Pair[A, Pair[B, C]] bedeuten.

+0

Was passiert, wenn ich zwei Symbole zB 'A ~> B ==> C'? – pathikrit

+0

das funktioniert, sofern Sie den Vortritt Recht für diese Infix erhalten "Type constructors", so dass Ihr Beispiel "Map [A, Pair [B, C]]" und nicht "Pair [Map [A, B], C]" bedeutet. Überprüfen Sie unbedingt Abschnitt 6.12.3 der Scala Sprachspezifikation –

+3

'A ~> B ~> C' kann nicht mit" Map [A, Map [B, C]] "übersetzt werden. Es kann auch nichts ohne Klammern bedeuten: Map [A, Pair [B Siehe, C]] '. meine Antwort. –

Verwandte Themen