官术网_书友最值得收藏!

Infix types

In the same way that Scala has infix operators, it has infix types. An infix type, such as Op B, is just any type that has exactly two type operands. It is equivalent to the type defined as Op[A, B]Op may be any valid identifier.

The type operators have the same associativity as term operators—they are left associative unless an operator ends in : (colon), in which case it is right associative. Consecutive infix operators must have the same associativity. Let's look at an example to understand what this means:

type Or[A, B]
type And[A, B]
type +=[A, B] = Or[A, B]
type =:[A, B] = And[A, B]

type CC = Or[And[A, B], C]
type DA = A =: B =: C
type DB = A And B And C

// type E = A += B =: C // wrong associativity
type F = (A += B) =: C

Here, we defined four types, all of which have two type parameters and so can be used as infix types. Then, we define a type called CC, which expresses some relation between the A, B, and C types. The DA and DB type definitions show what the type definition looks like in infix notation. The first attempt to define some type, E, to be the same as the C type fails because of the different associativity of the types, =+ and =:, and we have demonstrated how parentheses can be used to work around this rule.

If used properly, infix types can greatly improve the readability of the code:

type |[A, B] = Or[A, B]
type [A, B] = And[A, B]
type G = A B | C

Here, we can see how infix types allow you to define type relation in a way that looks similar to Boolean operations.

主站蜘蛛池模板: 高邮市| 怀来县| 长岛县| 浦江县| 图片| 海城市| 朔州市| 专栏| 屏东县| 房产| 龙山县| 和政县| 开封市| 建湖县| 沙湾县| 霍邱县| 托里县| 柳河县| 呈贡县| 苏州市| 金平| 衢州市| 博罗县| 得荣县| 磐石市| 济阳县| 池州市| 江北区| 凌海市| 巴林左旗| 合水县| 轮台县| 新平| 凌源市| 兴城市| 乌兰察布市| 宁津县| 抚松县| 岱山县| 宁晋县| 湟中县|