2013-08-03 15 views
6

Ben yazarın açıkça belirlenmiş yetkinlik için aldığım Joshua Suereth, kitaba göre «Derinliği Scala» okuyorum. Ben 3. sayfadaki ve yazım hataları demet ve tutarsız biçimlendirme (Tamam, ben bu hataların toleranslı oldum) çok basit bir senaryoyu çözmeye fonksiyonel yaklaşımla ilgili aşağıdaki örnekte tökezledi peşindeyim. dikkatli açıkça mavi baskı (hiçbir somut yöntem tanımlanmıştır ...) ... «yakalamak» açıkça başka yazım hatası o ... Cat ayrılmış bir kelime ve Bird örneklenebilir değildir sağlanan olduğunu var sağlanan ileScala API 2.10. *: Function2.andTk ne oldu?

trait Cat 
trait Bird 
trait Catch 
trait FullTummy 

def catch(hunter: Cat, prey: Bird): Cat with Catch 
def eat(consumer: Cat with Catch): Cat with FullTummy 

val story = (catch _) andThen (eat _) 
story(new Cat, new Bird) 

ben ...

örnek aldı

... ama başka bir kaza sonucu hata bu kadar İşletmesi örnek kalitesiz rağmen, ben işlev kompozisyon açısından tanımlanır «hikayesi» val (andThencompose arasında «ters ilişkisel» olduğunu) düşünün olamaz edilir Örneğin çekirdeği.

Etkili bir şekilde örnek, yerel sürüm Scala (2.10.1) üzerinde derlenmeyecek ve mevcut en son sürümde (2.10.2) belgelenmemiştir.

trait Function2ex[-T1, -T2, +R] extends Function2[T1, T2, R] { 
    def andThen[A](g: R => A): (T1, T2) => A = { (x, y) => g(apply(x, y)) } 
} 

buldum API kısa inceleme sonrasında andThen sadece function1 tarafından ve sözde kayboldu desteklendiğini: (takip) faydasının ve uygulaması başarmak kolay olduğunu hiç şüphe yoktur

İşlevsiz2 dan Function22 çok sorun şudur:

1'den büyük Arity işlevi * ile andThen ve compose desteklemek için geçerli deyim nedir? O örnek burada hiç oluyor ama nerede anlamıyorum

cevap

5

scala 2.10.2 yılında derler bazı kod.

trait Cat 
trait Bird 
trait Catch 
trait FullTummy 

def `catch`(hunter: Cat, prey: Bird): Cat with Catch = ??? 
def eat(consumer: Cat with Catch): Cat with FullTummy = ??? 

val story = (`catch` _).tupled andThen (eat _) 
story(new Cat with Catch, new Bird {}) 

Ben ayrılmış bir kelime çünkü catch alıntı ve Function2 tuplea vardı.

+0

Eğer tupled hakkında ayrıntılı lütfen edebilirsiniz. (Ziyade tek parametre "tüketici" den tuple kabul etmez yemek çünkü ben onu başka türlü çalışmaz biliyorum, ama neden biz tuplea var mıydı) neden kullanma gerekti? ve tam Biz '(' yakalamak \ '_ \)' Bir 'andThen' yöntemine sahip olmayan bir' Function2', çünkü bunu tuplea zorunda – igx

+1

ne yapıyor. Ve dönüş tipi ('Catch' ile Cat ')' yemek 'argüman tipine uymak zorundadır. –

+0

, bu yüzden "andThen" işlevini elde etmek için bunu Function1'e dönüştürmek için tupled kullanıyoruz, doğru mu? – igx