Scala:

2013-10-26 12 views
6

parametresi olarak curried fonksiyonunu geçmek aşağıdaki gibi bir şey yapmak mümkün mü?Scala:

def takeCurriedFnAsArg(f: (Int)(implicit MyClass) => Result) 

cevap

10

Evet, bu mümkündür. Eğer implicit olarak işaretlenmiş ikinci Körili parametre varsa

, fonksiyon gibi görünüyor değil Çeşidi

Int => (MyClass => Result) => ResultOfFunction 

hangi it would curried yüksek mertebeden fonksiyon parametresi düzenli parametre olsaydı olmak; bunun yerine, şuna benzer:

Int => ResultOfFunction 

İşte size kısa bir örnek: Gördüğünüz gibi

scala> def curriedFn(i : Int)(implicit func : String => Int) : Boolean = (i + func("test!")) % 2 == 0 
curriedFn: (i: Int)(implicit func: String => Int)Boolean 

scala> implicit val fn : String => Int = s => s.length 
fn: String => Int = <function1> 

scala> curriedFn _ 
res4: Int => Boolean = <function1> 

, implicit parametre 'ortadan' gördü. Neden ve nasıl? Birisi benden daha bilgili bir soru. Tahmin etmem gerekirse, derleyicinin parametreyi örtülü değerle doğrudan değiştirdiğini söyleyebilirim, ancak bu çok yanlış olabilir. İkinci fonksiyon parametresi örtülü değildi Şimdi eğer

scala> def foo(func : Int => Boolean) = if(func(3)) "True!" else "False!" 
foo: (func: Int => Boolean)String 

scala> foo(curriedFn) 
res2: String = True! 

:

scala> def curriedNonImplicit(i : Int)(fn : String => Int) : Boolean = (i + fn("test!")) % 2 == 0 
curriedNonImplicit: (i: Int)(fn: String => Int)Boolean 

scala> curriedNonImplicit _ 
res5: Int => ((String => Int) => Boolean) = <function1> 

Gördüğünüz gibi, tip Neyse

, parantezler bir yana, burada çok kendi durumunuza uygun bir örnek fonksiyonun biraz farklı. Bu çözüm çok farklı görünecektir anlamına gelir:

scala> def baz(func : Int => (String => Int) => Boolean) = if(func(3)(s => s.length)) "True!" else "False!" 
baz: (func: Int => ((String => Int) => Boolean))String 

scala> baz(curriedNonImplicit) 
res6: String = True! 

Bunu örtülü önce sağlanmadı gibi yöntem içinde işlevi doğrudan belirtmek gerekir.

+0

Her iki durumu (örtülü ve örtülü olmayan) kapsamlı örneklerle açıkladığınız için teşekkür ederiz. – Prasanna