我对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
(编写,请参阅Scala 2.13语言规范的3.10infix Types部分。
您可以在core/src/main/scala/scalaz/Either.scala
:中看到/
的定义
sealed abstract class /[A, B] extends Product with Serializable