【发布时间】:2021-02-14 17:09:08
【问题描述】:
我有一种情况,我所知道的解决方案都不是好的解决方案。我正在尝试定义一个类型类,如下例所示,它有一个抽象类型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]
}
}
感激地收到任何帮助/想法。
【问题讨论】:
-
其实我猜你已经问过类似的问题stackoverflow.com/questions/64130596/…
-
@DmytroMitin - 感谢下面的回答 - 我现在正在工作,但今晚会试一试。是的,这个问题是相似的,尽管不完全相同。在过去的几个月里,我想我已经发布了至少十个关于这个和密切相关的主题的问题,其中绝大多数问题你都已经很好地回应了。我一直在使用大量的试验和错误来弄清楚什么是实际可能的,然后什么对图书馆用户来说是符合人体工程学的。
-
是的,我知道大约十个问题,没关系,我只是提到你已经问过构造方法(
instance那里,apply这里)对于具有多态的类型类方法(get[R]那里,changeType[_T]这里)和多态函数类型([A] => (A, R) => O那里,[X] => A[X]这里)。 -
@DmytroMitin - 是的 - 在我看来,这个问题与另一个问题不同。实际上,它可能不是……
标签: scala typeclass polymorphic-functions