【发布时间】:2020-05-01 00:52:34
【问题描述】:
我对 scala 隐式比较陌生,但如果我想能够做到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 = /* ... */
【问题讨论】:
-
\/是一个类型名称。A \/ B是\/[A, B]的语法糖 -
那我如何获得自己的合成糖?
-
开箱即用。它不适用于您的情况,因为类名不能以
?或<开头 -
酷,谢谢。我得到了
A |??| B工作,但似乎A.??,或者任何变体都不起作用? -
无后缀不适用于类参数。现在也不鼓励方法调用。