Scala:访问Either的常见子类型

Ric*_*ver 3 scala

CSplit和MapCanvT都是Scala Swing组件的子类型.因此,类型CanvNode始终是Component的子类型.我还没有掌握Scala系列的功能,还有像折叠一样.有没有办法减少这个代码(除了把匹配放在一个函数中)并摆脱那些匹配?

type CanvNode = Either[CSplit, MapCanvT]   

class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{         
  topComponent =  s1 match { case Left (s) => s; case Right (s) => s} 
  bottomComponent = s2 match { case Left (s) => s; case Right (s) => s}
Run Code Online (Sandbox Code Playgroud)

以上编译.理想情况下,我只想写:

type CanvNode = Either[CSplit, MapCanvT]   

class CSplit(var s1: CanvNode, var s2: CanvNode) extends SplitPane
{         
  topComponent =  s1
  bottomComponent = s2
Run Code Online (Sandbox Code Playgroud)

但那不会编译.

Tra*_*own 6

fold实际上会在这里做你想做的事.你可以改写这个:

topComponent = s1 match { case Left (s) => s; case Right (s) => s}
Run Code Online (Sandbox Code Playgroud)

这样:

topComponent = s1.fold(identity, identity)
Run Code Online (Sandbox Code Playgroud)

和推断出的类型将是最小上界的CSplit和MapCanvT.

Either 还提供了一种稍微更紧凑的方式来写这个:

topComponent = s1.merge
Run Code Online (Sandbox Code Playgroud)

通过隐式转换为MergeableEither.