首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala中的高阶类型类

scala中的高阶类型类
EN

Stack Overflow用户
提问于 2017-05-16 21:17:33
回答 1查看 159关注 0票数 1

我正在努力理解类型化,到目前为止,我已经了解了Monoids,这是非常简单的:

代码语言:javascript
复制
object AbstractAlgebra {
  case class Pair[A,B](a: A, b: B)

  trait Monoid[T] {
    def times(t1: T, t2: T): T
    def unit: T
  }
  object Monoid {
    implicit object MonoidIntPlus extends Monoid[Int] {
      def times(i1: Int, i2: Int) = i1 + i2
      def unit = 0
    }
    implicit object StringMonoid extends Monoid[String] {
      def times(s1: String, s2: String) = s1 + s2
      def unit = ""
    }

    implicit object PairOfMonoids extends Monoid[Pair[Monoid, Monoid]] = ???
  }
}

我想我的问题是Monoid[PairMonoid,Monoid]类型,因为我并没有真正地处理两个单类实例,只有两个类是隐式幺半群,但我不知道如何表达它。

如有任何帮助或推荐人,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-16 21:28:31

Monoid本身并不是一个类型。它是一个类型构造函数,所以Pair[Monoid, Monoid]没有任何意义。

您真正想要的实际上是以下内容:假设您有两个给定类型的Monoid类型类实例AB,那么也为Pair[A, B]创建一个实例。

这可以如下所示(实现是您可以派生的最自然的实现):

代码语言:javascript
复制
implicit def monoidPair[A, B](implicit A: Monoid[A], B: Monoid[B]): Monoid[Pair[A, B]] = new Monoid[Pair[A, B]] {
  def times(p1: Pair[A, B], p2: Pair[A, B]) =
    Pair(A.times(p1.a, p2.a), B.times(p1.b, p2.b))
  def unit = Pair(A.unit, B.unit)
}

这将实现我前面解释的那样:如果找到了Monoid[A]Monoid[B]类型的隐式实例,那么它将在作用域中放置一个新的Monoid[Pair[A, B]]类型隐式实例。

注意:您的case类Pair[A, B]已经在Predef中定义了(尽管它自2.11.0以来就被废弃了),被定义为Tuple2[A, B](A, B)

其他注意事项.如果不喜欢将隐式实例定义为defval,则可以对隐式类执行相同的操作:

代码语言:javascript
复制
implicit class MonoidPair[A, B](implicit A: Monoid[A], B: Monoid[B]) extends Monoid[Pair[A, B]] {
  ... //same body as before
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44011731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档