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)
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)
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.
Her iki durumu (örtülü ve örtülü olmayan) kapsamlı örneklerle açıkladığınız için teşekkür ederiz. – Prasanna