首页 文章

是否有可能在Scala中“嘲笑”更高级的类型?

提问于
浏览
20

假设我有一个具有两个类型参数的特征,例如:

trait Qux[A, B]

和具有较高类型参数的另一个特征,例如,

trait Turkle[C[_]]

我希望能够为 Qux 的一个类型参数替换一个固定值,以便它可以用于参数化 Turkle .

这是一个示例(在Scala中没有意义的代码!):

trait Baz[A] extends Turkle[Qux[A, _]]

任何人有任何想法如何实现这种效果?

4 回答

  • 2

    Jason Zaugg想出了最简洁的方法:

    trait Baz[A] extends Turkle[({type x[a]=Qux[A, a]})#x]
    

    IntelliJ的Scala插件可以选择将其折叠为:

    trait Baz[A] extends Turkle[x[a]=Qux[A, a]]
    
  • 3

    你的意思是这样的?

    trait QuxWithString[A] extends Qux[A, String]
    new Turkle[QuxWithString]{}
    

    这是类型的模拟到部分应用程序 .

  • 0
    trait Turkle[C[_]]
    trait Qux[A,B]
    trait Wraps[A] {
      type Jkz[X] = Qux[A,X]
      trait Baz extends Turkle[Jkz]
    }
    
  • 22

    编译器插件kind projector也允许这样:

    // Explicit lambda, greek letters
    trait Baz[A] extends Turkle[λ[α=>Qux[A,α]]]
    
    // Explicit lambda, normal letters
    trait Baz[A] extends Turkle[Lambda[a=>Qux[A,a]]]
    
    // No explicit lambda, ? placeholder    
    trait Baz[A] extends Turkle[Qux[A,?]]
    

相关问题