2016-11-10 63 views
0

我想建立一個解釋我的ADT,但我不知道如何解決的好辦法如何從多態類型字段加載隱清單

sealed trait Polymorphic[T] 
case class Type1[T: Manifest](field1: T) extends Polymorphic[T] 
case class Type2[T: Manifest, V: Manifest](field1: T, field2:V) extends Polymorphic[T] { 
    def vManifest: Manifest[V] = manifest[V] 
} 

object Interpreter { 
    def eval[T: Manifest](polymorphic: Polymorphic[T]): T = { 
     polymorphic match { 
     case Type1(field) => 
      ??? 
     case value: Type2[T, _] => 
      implicit val vManifest = value.vManifest 
      evalType2(value) 
     } 
    } 

    def evalType2[T:Manifest, V:Manifest](type2: Type2[T,V]): T = ??? 
} 

此裝載艙單隱含的問題是我可以創建的最佳解決方案,但我不喜歡我必須創建vManifest函數才能在eval中加載清單。

有沒有更好的方法來做到這一點?

回答

1

記住T: Manifest只是一種簡寫的方式來編寫一個隱含的構造函數參數。如果你想這樣的說法可見外,只是讓它val

case class Type1[T](field1: T)(implicit val tManifest: Manifest[T]) extends Polymorphic[T] 
case class Type2[T](field1: T, field2: V)(implicit val tManifest: Manifest[T], val vManifest: Manifest[V]) extends Polymorphic[T] 

(最有可能這些天,你想ClassTagTypeTag而非Manifest)。

+0

謝謝,這將工作,但我需要隱式再次在上下文中聲明清單,有沒有辦法避免這種情況? – Mikel

+0

'import value.vManifest'也會這樣做。 –