2012-07-28 253 views
0

在以下情況下,名稱參數與功能發生衝突。名稱參數與功能類型之間的不匹配

鑑於有些系列化基礎設施:

// needs recursive access to itself. for reasons 
// beyond the scope of this questions, `self` must 
// be a by-name parameter 
class Transport(self: => Source[Transport]) 

// again: self is required to be by-name 
def transportSer(self: => Source[Transport]) : Serializer[Transport] = 
    new Serializer[Transport] { 
     def read(in: In)(implicit tx: Tx): Transport = new Transport(self) 
    } 

現在想象一個名叫Hook包裝與遞歸/相互連接性交易:

trait Tx { 
    def readSource[A](implicit ser: Serializer[A]) : Source[A] = 
     new Source[A] { 
     def get(implicit tx: Tx): A = ser.read(new In {}) 
     } 
}  
trait In 
trait Source[A] { def get(implicit tx: Tx): A } 
trait Serializer[A] { def read(in: In)(implicit tx: Tx): A } 

和示例以及它的串行輸入

trait Hook[A] { 
    def source: Source[A] 
} 

及其串行器:

def hookSer[A](peerSelf: Source[A] => Serializer[A]) : Serializer[Hook[A]] = 
    new Serializer[Hook[A]] { 
     def read(in: In)(implicit tx: Tx) : Hook[A] = 
     new Hook[A] with Serializer[A] { 
      val source: Source[A] = tx.readSource[A](this) 
      def read(in: In)(implicit tx: Tx) : A = peerSelf(source).read(in) 
     } 
    } 

那麼下面失敗:

val hs = hookSer[Transport](transportSer) 

<console>:15: error: type mismatch; 
found : => Source[Transport] => Serializer[Transport] 
required: Source[Transport] => Serializer[Transport] 
      val hs = hookSer[Transport](transportSer) 
            ^

如何這個問題能解決而不改變由名函數的參數(儘可能)?

回答

0

似乎可以寫類型(=> Source[A]) => Serializer[A]

def hookSer[A](peerSelf: (=> Source[A]) => Serializer[A]) : Serializer[Hook[A]] = ... 

val hs = hookSer[Transport](transportSer) 
val h = hs.read(new In {})(new Tx {}) 
val t = h.source.get(new Tx {}) 
相關問題