我对scala implicits比较陌生,但如果我想能够做的是 5.??
,我会做。
class MyInt(int: Int) {
// Useless, just to make a point
def ?? : Int = int * 100
}
implicit def toMyInt(int: Int): MyInt =
MyInt(int)
我的问题是,scalaz是怎么做到的?A \/ B
我怎么能做和上面一样的事情,添加我自己的操作符(但要和类型一起工作)?关于我想玩和做的事情,有一点背景。
abstract class Err(val message: String) { /* ... */ }
sealed trait MaybeErr[+E <: Err, +T] { /* ... */ }
最接近的我已经能够得到:
type ??[+T] = MaybeErr[Err, T]
type <??>[+E <: Err, +T] = MaybeErr[E, T]
def div1(t: Int, b: Int): ??[Int] = /* ... */
def div2(t: Int, b: Int): <??>[OtherErr, Int] = /* ... */
我想做的是:
// T.?? = MaybeErr[Err, T]
// E <??> T = MaybeErr[E, T]
def div1(t: Int, b: Int): Int.?? = /* ... */
def div2(t: Int, b: Int): OtherErr <??> Int = /* ... */
scalaz怎么能做到
A \/ B
我怎么能做同样的事情,如上所述
任何二进制类型构造函数 C[A, B]
也可写成后缀式 A C B
(或 C:[A, B]
作为 B C: A
的类型构造函数,以 :
冒号),见 第3.10节 Infix类型 的 Scala 2.13语言规范.
你可以看到以下的定义 \/
在 core/src/main/scala/scalaz/Either.scala
:
sealed abstract class \/[A, B] extends Product with Serializable