Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:方法上的非法循环继承_Scala_Pattern Matching_Implicit - Fatal编程技术网

Scala:方法上的非法循环继承

Scala:方法上的非法循环继承,scala,pattern-matching,implicit,Scala,Pattern Matching,Implicit,在对magnet模式和隐式解析顺序进行了一些指示之后,我在magnet类上遇到了一个奇怪的模式匹配问题。在第一个示例中,我得到了关于非法循环继承的错误,但通过切换模式匹配,我没有: sealed trait SeqOrFun[T1, T2] case class SeqMagnet[T](itr: Iterable[T]) extends SeqOrFun[T, T] case class FunMagnet[T1, T2](f: (T1 => T2)) extends SeqOrFun[

在对magnet模式和隐式解析顺序进行了一些指示之后,我在magnet类上遇到了一个奇怪的模式匹配问题。在第一个示例中,我得到了关于非法循环继承的错误,但通过切换模式匹配,我没有:

sealed trait SeqOrFun[T1, T2]
case class SeqMagnet[T](itr: Iterable[T]) extends SeqOrFun[T, T]
case class FunMagnet[T1, T2](f: (T1 => T2)) extends SeqOrFun[T1, T2]

def unfurl[T1, T2](x: SeqOrFun[T1, T2], y: SeqOrFun[T1, T2]): (Iterable[T1], Iterable[T2]) = {
  (x, y) match {
    case (SeqMagnet(xs: Iterable[T1]), FunMagnet(yf: (T1 => T2))) => (xs, xs.map(yf))
  }
}
导致:

<console>:14: error: illegal cyclic inheritance involving unfurl
           case (SeqMagnet(xs: Iterable[T1]), FunMagnet(yf: (T1 => T2))) => (xs, xs.map(yf))
                             ^
<console>:14: error: illegal cyclic inheritance involving unfurl
           case (SeqMagnet(xs: Iterable[T1]), FunMagnet(yf: (T1 => T2))) => (xs, xs.map(yf))
                          ^
<console>:14: error: illegal cyclic inheritance involving unfurl
           case (SeqMagnet(xs: Iterable[T1]), FunMagnet(yf: (T1 => T2))) => (xs, xs.map(yf))
                                              ^
<console>:13: error: illegal cyclic inheritance involving unfurl
         (x, y) match {
由谁来编译

<console>:13: warning: match may not be exhaustive.
It would fail on the following input: (FunMagnet(Function1()), FunMagnet(_))
         (x, y) match {
         ^
unfurl: [T1, T2](x: SeqOrFun[T1,T2], y: SeqOrFun[T1,T2])(Iterable[T1], Iterable[T2])
:13:警告:匹配可能并不详尽。
它将在以下输入上失败:(FunMagnet(Function1()),FunMagnet(33;))
(x,y)匹配{
^
展开:[T1,T2](x:sekorfun[T1,T2],y:sekorfun[T1,T2])(可编[T1],可编[T2])
(唯一的变化是

case(SeqMagnet(xs:Iterable[T1])、FunMagnet(yf:(T1=>T2))=>(xs,xs.map(yf))

case(FunMagnet(xf:(T2=>T1)),SeqMagnet(ys:Iterable[T2])=>(ys.map(xf),ys)

因为它们是对称的,我不明白一个可以编译,另一个不能。我仍在试图理解这个错误,因为其他用户似乎是从递归类型定义(我不认为我在这里这么做)中得到它的

更新:我相信如果我将磁铁定义为普通类并编写自己的unapply方法,问题就会消失

<console>:13: warning: match may not be exhaustive.
It would fail on the following input: (FunMagnet(Function1()), FunMagnet(_))
         (x, y) match {
         ^
unfurl: [T1, T2](x: SeqOrFun[T1,T2], y: SeqOrFun[T1,T2])(Iterable[T1], Iterable[T2])