【问题标题】:Type class API in ScalaScala 中的类型类 API
【发布时间】:2016-07-20 22:25:51
【问题描述】:

这是我正在考虑在 Scala 中使用的一种模式,用于在不限制类型的情况下定义合同,但仍然拥有流畅的 API,没有所有冗长的隐式 [..]。

我们的想法是在类型类之上构建一个隐式类,如下所示:

implicit class NumberLikeApi[N : NumberLike](n: N)
  def add(n2: N): N = implicitely[NumberLike[N]].add(n, n2)
}

现在你可以在范围内使用正确的隐式:

val sum = n1.add(n2)

代替:

val sum = implicitly[NumberLike[N]].add(n1, n2)

我的问题:是否有可能以某种方式自动化/生成隐式类部分?它基本上是类型类的复制。

我在语言和标准库中找不到东西。库中是否有可以执行此操作的宏?

【问题讨论】:

    标签: scala typeclass implicit


    【解决方案1】:

    simulacrum的目的应该就是这个。

    从它的 README 中,你可以写

    import simulacrum._
    
    @typeclass trait Semigroup[A] {
      @op("|+|") def append(x: A, y: A): A
    }
    

    然后像这样使用它

    // instance for Semigroup[Int] 
    implicit val semigroupInt: Semigroup[Int] = new Semigroup[Int] {
      def append(x: Int, y: Int) = x + y
    }
    
    import Semigroup.ops._
    
    1 |+| 2 // 3
    

    【讨论】:

    • 太棒了!,不知道这个。在我的搜索尝试中不知何故未能找到它。非常感谢,这使得该模式有点可用。
    猜你喜欢
    • 2011-04-09
    • 2016-11-06
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多