2013-03-17 87 views

回答

15

如果你看看下面的Ordering.on方法標準庫:

def on[U](f: U => T): Ordering[U] 

你會看到,on轉變的Ordering[T]Ordering[U]在拍攝功能從UT。因此,該方法on證人的事實,Ordering可以被看作是一個Contravariant仿用:

def contramap[A, B](f: B => A) = (fa: Ordering[A]) => fa.on(f) 

我也看到了託尼的博客文章和它幫助我終於使得這個三歲answer感從返璞詞到一個我的問題。

+0

謝謝。很簡單,一旦你看到它。 – Bradford 2013-03-18 03:01:30

16

假設您有一個類Conversion[X,Y]代表從類型X的值到類型Y的值的轉換。您可以將其與功能?=>X結合使用以預處理輸入或使用功能Y=>?對輸出進行後處理。例如:

trait Conversion[X,Y] { self=> 

    def apply(x: X): Y 

    def map[Z](f: Y=>Z) = new Conversion[X,Z] { 
    def apply(x:X): Z = f(self.apply(x)) 
    } 

    def contramap[W](f: W=>X) = new Conversion[W,Y] { 
    def apply(w: W): Y = self.apply(f(w)) 
    } 

} 
+0

你的意思是「從'X'類型的值到'Y'類型的值嗎? – huynhjl 2013-03-17 16:56:43

+0

@huynhjl謝謝。我修正了錯字。 – paradigmatic 2013-03-17 17:11:45