2017-04-04 61 views
0

我有以下特点,其中:选择模式使用

sealed trait Sum[+A, +B] { 
    def fold[C](error: A => C, success: B => C): C = 
    this match { 
     case Failure(v) => error(v) 
     case Success(v) => success(v) 
    } 
} 
final case class Failure[A](value: A) extends Sum[A, Nothing] 
final case class Success[B](value: B) extends Sum[Nothing, B] 

正如你可以看到,有一个fold方法实现。

我可以在fold方法移到一个同伴对象如下:

sealed trait Sum[+A, +B] 
final case class Failure[A](value: A) extends Sum[A, Nothing] 
final case class Success[B](value: B) extends Sum[Nothing, B] 

object Sum{ 
    def fold[A, B, C](s: Sum[A,B], error: A => C, success: B => C): C = 
     s match { 
      case Failure(v) => error(v) 
      case Success(v) => success(v) 
     } 
} 

什么是更方便的模式,在第一或第二例子,其中的情况呢?

回答

0

第二个不起作用,因为它指向Sum伴随对象,并且未定义类型变量A和B.

因此使用第一种模式!

+0

对不起,这是我的错,我纠正了代码。 –

+0

您仍然在折叠方法中使用它,它始终是Sum伴随对象 – Harald

+0

IT现在应该没问题。 –

1

后者可能无法按预期工作,因为this在这种情况下是对象Sum而不是FailureSuccess的实例。 无论如何,我希望移居的实现来区分等级:

case class Failure[A](value: A) extends Sum[A, Nothing] { 
     def fold[C](error: A => C, success: B => C): C = error(value) 
    } 

    case class Success[A](value: B) extends Sum[A, Nothing] { 
     def fold[C](error: A => C, success: B => C): C = success(value) 
    } 
+0

当然,你必须在基本特征中声明'def fold ...' –

+0

抱歉,这是我的错,我更正了代码 –

0

我更喜欢第一个(或托马斯Perek的回答修改)。第二应改为

def fold[A, B, C](s: Sum[A,B])(error: A => C, success: B => C): C = 
    s match { 
     case Failure(v) => error(v) 
     case Success(v) => success(v) 
    } 

,这样编译器已经知道AB通过它获取到类型检查的errorsuccess参数的时间。