Предположим, что у меня есть этот код в Haskell, и я хочу, чтобы попытаться придумать что-то вроде этого в Scala:Рекурсивный определение типа в Scala
data CatList q a = E | C a (q (CatList q a))
instance Queue q => CatenableList (CatList q) where
-- methods
Обратите внимание, что CatList
либо пусто, либо является элементом плюс очередь (как определено классом q
) CatList
s. В Scala, я пытаюсь сделать что-то вроде
sealed trait CatList[+Q, +E]
object Empty extends CatList[Nothing, Nothing]
case class C[Q[_], E](x: E, q: Q[CatList[Q, E]]) extends CatList[Q[???], E]
но проблема в том, Q[_]
принимает параметры, так что мне нужно, чтобы обеспечить что-то в предложении extends
, что приводит к CatList[Q[CatList[Q[???], E], E]
, который сбивает с толку.
Я могу попробовать подход Haskell, говоря, что Q[_]
не что иное, как тип, и идти с
sealed trait CatList[+Q[_], +E]
object Empty extends CatList[Nothing, Nothing]
case class C[Q[_], E](x: E, q: Q[_]) extends CatList[Q[_], E]
но терпит неудачу с
Error:(16, 56) Q[_] takes no type parameters, expected: one
case class C[Q[_], E](x: E, q: Q[_]) extends CatList[Q[_], E]
^
Таким образом, вопрос, есть ли способ обойти это?
Вы полностью изменили вопрос. Пожалуйста, восстановите исходный вопрос и спросите об этом отдельно. (Кроме того, 'q' не является классом в этом коде Haskell, это просто переменная типа вида * * -> *') –
Да, извинения, как часто бывает, я попытался немного разъяснить вопрос и понял, что в то время как У меня проблема с рекурсией, основная проблема совершенно другая, и ... Во всяком случае, вернувшись, она примет через секунду. – alf
На вопрос, задан отдельный вопрос, http://stackoverflow.com/questions/35947116/use-type-parameters-type-argument-as-field-type-in-scala?lq=1 – alf