2017-04-04 50 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參數的時間。