2016-02-19 27 views
9

bir işlev` type` o`implicit` parametreleri

Scala
type F = (Int, Boolean)(implicit String) => Unit 

gibi bir şey ilan etmek nasılsa mümkün mü Declare? "Işlevi" ve "yöntemi" arasında Scala çok önemli bir fark vardır

+0

Maalesef öyleydi "Tür f = (Int, Boolean) => (String) yapabilir => Yine de birim ". Bunun dolaylı olarak işe yaramadığını söylemekte haklısınızdır, sanırım çünkü bu türlere bağlı kalmamalısınız. Bir Int ve Boolean alan bir işlev, kapsamdaki implikasyonlardan bağımsız olarak bir Int ve Boole içeren bir işlevdir. düzenleme: Tamam, aşağıda yanıtı açıklandı, bir yöntem bir işlev değildir ve işlevlerin bir anlamı yoktur. –

cevap

18

:

Fonksiyonlar değerlerdir ve variadic olamaz, polimorfik olamaz, by-name argümanlar alamaz aşırı yüklenemez ve örtük parametreler olamaz. Yöntemler bunlara sahipken, bunlar değerler olarak geçemezler.

Fonksiyon tipleri aşağıdaki biçimde, standart kütüphanesinde sadece özellikler şunlardır: bu tür apply yöntem değil nasıl yaptığını

trait FunctionN[T1, ..., TN, R] { 
    def apply(x1: T1, ..., xN: TN): R 
} 

Not örtük bir parametre listesi var. Bu nedenle, işlevlerin hiçbir zaman gizli parametreleri olmayacaktır.

Yani örtülü parametreleri almak "işlevleri" geçirmek istiyorsanız, kendi özelliği oluşturmalısınız:

trait Function2I1[T1, T2, I1, R] { 
    def apply(a1: T1, a2: T2)(implicit i1: I1): R 
} 

type F = Function2I1[Int, Boolean, String, Unit] 

Şimdi (parlak lambda sözdizimi ile değil de olsa) tip F örneklerini oluşturabilirsiniz:

val f = new F { 
    override def apply(x: Int, y: Boolean)(implicit z: String): Unit = ??? 
} 
implicit val x = "hi" 
f(1, true) // implicitly passes x 

sadece (Int, Boolean) => String => Unit yazma, örtük parametre olmadan curried fonksiyonları istiyorum. Eğer bir işleve bir yöntem dönüştürmek istiyorsanız

, bir lambda kullanın: Ben yorum sildi

class A { 
    def f(a: String)(implicit b: String): String = a + b 
} 
val a = new A 
val m = a.f(_) // takes the implicit in this scope 
İlgili konular