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

pat*_*rit 9 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)类型的别名?

Mar*_*ing 13

有趣的是,为符号方法定义的运算符优先级似乎不适用于符号类型别名.相反,中缀类型别名总是被评估为左关联:

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]]
Run Code Online (Sandbox Code Playgroud)

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

classOf[A - (B / C)] // Class[-[A,/[B,C]]
Run Code Online (Sandbox Code Playgroud)

所以最接近的答案是:

type ~>[A,B] = Map[A,B]
type ~~~>[A,B] = Pair[A,B]
classOf[A ~> (B ~~~> C)] // Map[A,Pair[B,C]]
Run Code Online (Sandbox Code Playgroud)

只有使用右关联别名(以...结尾:)才能省略括号

type ~:[A,B] = Map[A,B]
type ~~~:[A,B] = Pair[A,B]
classOf[A ~: B ~~~: C] // Map[A,Pair[B,C]]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 很好的澄清.直到你的回答没有意识到优先级不一样! (3认同)