假设我在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]
^
所以问题是,有没有办法解决这个问题?
答案 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
带有一些未知参数“)。