【问题标题】:Is it possible to propagate a type parameter of a type parameter to a parameterized class in Scala?是否可以将类型参数的类型参数传播到 Scala 中的参数化类?
【发布时间】:2016-12-08 02:41:26
【问题描述】:

假设我有一个特征Foo[A, B]

我想定义一个类Bar,使用Foo 进行参数化,并在Bar 方法中重用Foo 类型参数。如下所示(此 sn-p 无法编译):

trait Bar[Foo[A, B]] {
  def doSmth[C](A => C): C
}

有什么方法可以实现类似的功能,并且在Bar 声明中仍然只有一个类型参数?

附言如果有人可以为所描述的内容提出正确的术语,那也很棒。

【问题讨论】:

  • 如果Foo 是一个特征,那么将它包含在类型参数中的目的是什么?用例是什么?
  • @m-z:我正在尝试创建一个基于Bar 的计算链(虽然我不确定它是否可以称为Monad)。 Foo[A, B] 代表当前的计算步长,它可以像Function1 一样。我真的很希望 Bar 部分在其类型中携带一些计算上下文。
  • 您是否需要了解Bar 中的Foo?还是只有类型参数?也就是说,如果你确实有多个类型参数,是Bar[A, B] 还是Foo[A, B, F[A, B]

标签: scala types typeclass


【解决方案1】:

不确定,但也许这是您想去的地方附近的某个地方。

trait Foo[A,B]
trait Bar[A] { self: Foo[A,_] =>
  def doSmth[C](atoc: A => C): C
}

或者,使用类型别名。

trait Foo[A,B] {type FooA = A}
trait Bar { self: Foo[_,_] =>
  def doSmth[C](atoc: FooA => C): C
}

这意味着当您有 Bar 时,需要 Foo

【讨论】:

    【解决方案2】:

    您可以使用 # 运算符来访问类或特征的类型成员。

    trait M {
        type A
        type B
      }
    
      class F[X,Y] extends M {
        type A = X 
        type B = Y 
      }
    
      trait Bar[F] {
        def doSmth[C](x: M#A => M#B): C
      }
    

    【讨论】:

      猜你喜欢
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2018-09-24
      相关资源
      最近更新 更多