对于> 2类型参数的Scala中缀类型别名?

时间:2014-04-28 06:22:17

标签: scala scalaz type-alias

我知道在Scala中,您可以执行type ===>[A, B] = Map[A, B],然后您可以使用中缀表示法来定义def foo: String ===> Int,这与def foo: Map[String, Int]相同。有没有办法利用这个中缀表示法来创建带有> 2参数的类型?例如,我想要这样的东西:

type A ~> B ~~~> C是别名Map[A, Pair[B, C]]

无论如何,我可以写一下这句话:

type A to B -> C作为(A, B, C)类型的别名?

2 个答案:

答案 0 :(得分:13)

有趣的是operator precedence as defined for symbolic methods似乎不适用于符号类别别名。相反,中缀类型别名总是被评估为左关联:

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

不幸的是,这意味着如果没有像这样的括号,你永远不可能做你要求的事情:

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

所以最接近的答案如下:

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

只有在使用正确的关联别名(以:结尾)时才能使用括号

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

不幸的是,由于所有类型的别名具有相同的优先级,因此无法在没有括号的情况下混合使用左右关联别名。

关于问题的第二部分:(A,B,C)Tuple3[A,B,C]的语法糖,它是一个带有三个参数的类型。由于中缀类型只有两个参数,我担心我认为没有办法仅使用中缀类型来表示这种类型。您最终会使用嵌套的两种参数类型(例如(A,(B,C))((A,B),C)

答案 1 :(得分:4)

简答:不。 A ~> B ~> C不能代表Map[A, Pair[B, C]]

但可以指代Map[A, Map[B, C]]Pair[A, Pair[B, C]]