Scala中的递归类型定义

时间:2016-03-11 06:54:07

标签: scala types

假设我在Haskell中有这个代码,我想尝试在Scala中提出类似的东西:

data CatList q a = E | C a (q (CatList q a))

instance Queue q => CatenableList (CatList q) where
   -- methods

请注意CatList为空,或者是q s的元素加队列(由类型CatList定义)。在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]
                                                       ^

所以问题是,有没有办法解决这个问题?

1 个答案:

答案 0 :(得分: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带有一些未知参数“)。