2016-03-11 4 views
2

Предположим, что у меня есть этот код в 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] 
                ^

Таким образом, вопрос, есть ли способ обойти это?

+0

Вы полностью изменили вопрос. Пожалуйста, восстановите исходный вопрос и спросите об этом отдельно. (Кроме того, 'q' не является классом в этом коде Haskell, это просто переменная типа вида * * -> *') –

+0

Да, извинения, как часто бывает, я попытался немного разъяснить вопрос и понял, что в то время как У меня проблема с рекурсией, основная проблема совершенно другая, и ... Во всяком случае, вернувшись, она примет через секунду. – alf

+0

На вопрос, задан отдельный вопрос, http://stackoverflow.com/questions/35947116/use-type-parameters-type-argument-as-field-type-in-scala?lq=1 – alf

ответ

3

Вам нужно

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] 

[_] имеет различные значения в объявлении параметра типа как trait CatList[+Q[_], +E]Q является конструктором типа„) и используется как extends CatList[Q[_], E] (“Q с неизвестным параметром»).

Смежные вопросы