相关疑难解决方法(0)

选项上的折叠关系是什么,是等等还是折叠在Traversable上?

Scalaz提供了一个名为方法fold关于各种ADT的如Boolean,Option[_],Validation[_, _],Either[_, _]等.该方法基本上发生在对应于所有可能的情况该给定ADT的功能.换句话说,模式匹配如下所示:

x match {
  case Case1(a, b, c) => f(a, b, c)
  case Case2(a, b) => g(a, b)
  .
  .
  case CaseN => z
}
Run Code Online (Sandbox Code Playgroud)

相当于:

x.fold(f, g, ..., z)
Run Code Online (Sandbox Code Playgroud)

一些例子:

scala> (9 == 8).fold("foo", "bar")
res0: java.lang.String = bar

scala> 5.some.fold(2 *, 2)
res1: Int = 10

scala> 5.left[String].fold(2 +, "[" +)
res2: Any = 7

scala> 5.fail[String].fold(2 +, "[" +)
res6: Any = 7
Run Code Online (Sandbox Code Playgroud)

同时,对于Traversable[_] …

functional-programming scala category-theory scalaz catamorphism

10
推荐指数
2
解决办法
2031
查看次数

Scala:访问Either的常见子类型

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)

但那不会编译.

scala

3
推荐指数
1
解决办法
151
查看次数