我有一种情况,我所知道的解决方案都不是好的解决方案。我正在尝试定义一个类型类,如下例所示,其中它具有S
必须实现另一个类型类(未显示)的抽象类型Valid[A]
。感觉最简单的方法是创建一个apply
构造函数,这将强制用户输入S
并自动为sIsValid
.
问题在于该函数changeType
采用类型参数。尽管进行了一些谷歌搜索,但我还没有弄清楚如何为接受类型参数的函数编写类型注释(这可能是因为 Scala 似乎不允许带有类型参数的匿名函数)。我的方法在这里看起来是明智的吗?如果我可以为其提供类型注释,changeType
那么类型类用户仍然可以将非匿名函数传递给apply
构造函数,这似乎是一个最令人满意的解决方案。
abstract class IsTC[A[_], T] {
// type S is an abstract type rather than type parameter, but must implement Valid[A]
type S
implicit val sIsValid: Valid[S]
def get(self: A[T], i: Int): T
def changeType[_T]: A[_T]
}
object IsTC {
def apply[A[_], T, _S](
fget: (A[T], Int) => T,
fchangeType: // what should this type annotation be?
): IsTC[A, T] { type S = _S } = new IsTC[A, T] {
type S = _S
def get(self: A[T], i: Int) = fget(self, i)
def changeType[_T]: A[_T] = fchangeType[_T]
}
}
感激地收到任何帮助/想法。