Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala infix type aliasing for >2 type parameters?

I know in Scala, you can do type ===>[A, B] = Map[A, B] and then you can use infix notation to define def foo: String ===> Int which is same as saying def foo: Map[String, Int]. Is there any way to exploit this infix notation to create types with >2 arguments? For example, I want something like this:

type A ~> B ~~~> C to be an alias of say Map[A, Pair[B, C]] ?

Is there anyway I can write something line this:

type A to B -> C as alias for (A, B, C) type?

like image 568
pathikrit Avatar asked Apr 28 '14 06:04

pathikrit


2 Answers

Interestingly operator precedence as defined for symbolic methods doesn't seem to hold for symbolic type aliases. Instead infix type aliases are always evaluated left associative:

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]]

Unfortunately that means it will never be possible to do what you ask for without parentheses like this:

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

So the closest answer is the following:

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

Ommitting the parentheses will only be possible if you use right associative aliases (ending with :)

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

Again, unfortunately since all type aliases have the same precedence it is not possible to mix right and left associative aliases without parentheses.

Concerning the second part of your question: (A,B,C) is syntactic sugar for Tuple3[A,B,C] which is a type with three parameters. As infix types only take two parameters, I'm afraid that I believe there is no way to represent this type solely with infix types. You would always end up with nested two parameter types (e.g. (A,(B,C)) or ((A,B),C).

like image 190
Martin Ring Avatar answered Nov 13 '22 13:11

Martin Ring


Short answer: no. A ~> B ~> C cannot mean Map[A, Pair[B, C]].

It could be made to mean Map[A, Map[B, C]], though, or Pair[A, Pair[B, C]].

like image 28
Jean-Philippe Pellet Avatar answered Nov 13 '22 14:11

Jean-Philippe Pellet