我知道在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)
类型的别名?
答案 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]]
。