scalaz怎么能做到 "A / B",我怎么能做到自己的 "B.? "或 "A <?>B"

问题描述 投票:0回答:1

我对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 = /* ... */
scala implicit scalaz
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.