У меня есть следующий код;Параметр параметра типа должен быть признаком
object main
{
def main(args: Array[String]): Unit =
{
trait E
{
def test(): Unit = println("test :)")
}
class B[T](val x: Int)
{
def inc(): B[T] with T = new B[T](x + 1) with T
}
class A[T](f : B[T] with T => Unit)
{
def apply(b: B[T] with T) = f(b)
}
val b = new B[E](0) with E
val a = new A[E](b => b.test())(b)
}
}
Однако линия def inc(): B[T] with T = new B[T](x + 1) with T
не компилируется, что дает ошибку, что «необходимый тип класса, но T найден» и «T должна быть черта смешивать в». Я понимаю, почему это так, но я не могу найти способ обойти это! Я не нашел способ ограничить T
, чтобы быть чертой, из-за которой я боюсь, что такой подход не сработает ...
Чтобы дать дополнительную информацию о том, почему я пытаюсь достичь этого (просто выложите любой может предложить лучшее решение) У меня есть класс Parsec[S, U, E, A]
, который состоит из функций, которые принимают объект State[S, U, E] with E
. Идея состоит в том, что U
является пользователем данного состояния, A
является результатом анализатора, S
поток токенов и E
является некоторым расширением состояния (например, можно было бы создать Parsec[Stream[String, Char], Int, IndentationSensitive, List[Expr]]
и т. Д. И т. Д. U = Int
будет то, что пользователь хотел сосчитать, например, и что не нужно вмешиваться в состояние, требуемое для чувствительности с отступом (которое равно двум Ints), которое было бы обеспечено путем смешивания в значении IndentationSensitive
. Тогда, если пользователю нужна другая функциональность они могут держать смешивание в более признаков для парсеров.
Итак, есть в любом случае я могу тяготы параметра типа T
в коде, так что я могу смешать его в B
, или, если нет, то есть лучший способ выполнить то, что мне нужно?
Если это на самом деле не ясно, что я пытаюсь выполнить то this вопрос о иллюстрирует Просмотр Кода ситуации (в много более подробно). Но Parsec[S <: Stream[_, _], U, A]
заменяется на Parsec[S <: Stream[_, _], U, E, A]
и то же самое для государства и всех остальных частей.
Я не знаю точно, но я ожидаю, что это невозможно. Микшины обрабатываются во время компиляции, но для этого требуется динамическое микширование. – puhlen
но, конечно, этот тип может быть известен во время компиляции? В какой-то момент вы достигнете конкретного типа, если вы замените типы достаточно? –
Это невозможно. –