Context bounds shortcut with higher kinded-types

前端 未结 2 1659
梦毁少年i
梦毁少年i 2020-12-13 16:13

Is it possible to use the context bounds syntax shortcut with higher kinded-types?

trait One { def test[W   : ClassManifest]: Unit } // first-order ok
trait          


        
2条回答
  •  鱼传尺愫
    2020-12-13 16:47

    Note that implicitly[ClassManifest[List[_]]] is short for implicitly[ClassManifest[List[T] forSome {type T}]].

    That's why it works: ClassManifest expects a proper type argument, and List[T] forSome {type T} is a proper type, but List is a type constructor. (Please see What is a higher kinded type in Scala? for a definition of "proper" etc.)

    To make both ClassManifest[List[String]] and ClassManifest[List] work, we'd need to overload ClassManifest somehow with versions that take type parameters of varying kinds, something like:

    class ClassManifest[T] // proper type
    class ClassManifest[T[_]] // type constructor with one type parameter
    class ClassManifest[T[_, _]] // type constructor with two type parameters
    // ... ad nauseam
    

    (On an academic note, the "proper" way to do this, would be to allow abstracting over kinds:

        class ClassManifest[T : K][K]
    
        implicitly[ClassManifest[String]] // --> compiler infers ClassManifest[String][*]
        implicitly[ClassManifest[List]] // --> compiler infers ClassManifest[List][* -> *]
    

    )

提交回复
热议问题