【问题标题】:How is scalaz able to do "A \/ B", and how can I do my own "B.??" or "A <??> B"scalaz 怎么能做“A \/ B”,我怎么能做我自己的“B.??”或“A <??> B”
【发布时间】: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] 的语法糖
  • 那我如何获得自己的合成糖?
  • 开箱即用。它不适用于您的情况,因为类名不能以 ?&lt; 开头
  • 酷,谢谢。我得到了A |??| B 工作,但似乎A.??,或者任何变体都不起作用?
  • 无后缀不适用于类参数。现在也不鼓励方法调用。

标签: scala implicit scalaz


【解决方案1】:

scalaz 怎么能做A \/ B,我怎么能做和上面一样的事情

任何二进制类型构造函数C[A, B] 也可以写成中缀形式A C B(或C:[A, B] 写为B C: A,用于以: 冒号结尾的类型构造函数),参见Scala 2.13 Language Specificationsection 3.10 Infix Types .

你可以在core/src/main/scala/scalaz/Either.scala中看到\/的定义:

sealed abstract class \/[A, B] extends Product with Serializable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多