scala - 特征成员中的高级类型:_$1 没有类型参数,预期:1
scala - Higher kinded type in trait member: _$1 takes no type parameters, expected: 1
当我有以下代码时,我认为有些事情我不太理解:
trait Configuration[F[_]] {
def get(key: String): F[ConfigValue]
}
class InMemoryConfig extends Configuration[Option] {
override def get(key: String): Option[ConfigValue] = ???
}
class InFileConfig(path: String) extends Configuration[Try] {
override def get(key: String): Try[ConfigValue] = ???
}
trait Logging {
def config: Configuration[_] // does not work
// ...
}
class DefaultLogging {
override val config = new InMemoryConfig
// ...
}
classes 的名称几乎没有意义,general 目标是在特征中拥有一个成员而不定义参数类型,以便 延迟选择直到执行(实际上是在DefaultLogging
class)。
因为 Logging
不知道哪种类型的构造函数将用于 Configuration
它必须像任何其他类型参数一样继承它。
因此:
trait Logging[F[_]] {
def config: Configuration[F]
// ...
}
这同样适用于任何依赖于Logging
它需要指定类型或保持依赖性的东西。
因此,一个常见的观察是是否需要这种直接依赖,但这成为设计问题,有时是个人偏好问题。
当我有以下代码时,我认为有些事情我不太理解:
trait Configuration[F[_]] {
def get(key: String): F[ConfigValue]
}
class InMemoryConfig extends Configuration[Option] {
override def get(key: String): Option[ConfigValue] = ???
}
class InFileConfig(path: String) extends Configuration[Try] {
override def get(key: String): Try[ConfigValue] = ???
}
trait Logging {
def config: Configuration[_] // does not work
// ...
}
class DefaultLogging {
override val config = new InMemoryConfig
// ...
}
classes 的名称几乎没有意义,general 目标是在特征中拥有一个成员而不定义参数类型,以便 延迟选择直到执行(实际上是在DefaultLogging
class)。
因为 Logging
不知道哪种类型的构造函数将用于 Configuration
它必须像任何其他类型参数一样继承它。
因此:
trait Logging[F[_]] {
def config: Configuration[F]
// ...
}
这同样适用于任何依赖于Logging
它需要指定类型或保持依赖性的东西。
因此,一个常见的观察是是否需要这种直接依赖,但这成为设计问题,有时是个人偏好问题。