有趣的是,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)。