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)
.
Große Klärung. Haben sie nicht, bis sie Ihre Antwort erkennen, dass die Priorität nicht das gleiche war! –
Ist es möglich,' A wie B zu erreichen ~> C' bedeuten '(A, B , C) '? – pathikrit
@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. –