Daha önce başka bir yerde sorulmuşsa beni affet. İşlev değerleri ve örtük parametreler içeren bir Scala sözdizimi sorusu var.Scala Implicits Fonksiyonel Literallar
Scala'nın köreltme özelliği ile dolaylı sonuçları kullanıyorum. Mesela ben bir toplamı işlevi vardı ve örtük bir ikinci argüman yapmak istiyorsa:
scala> def sum(a: Int)(implicit b: Int) = a + b
sum: (a: Int)(implicit b: Int)Int
fonksiyon değeri sözdizimini kullanarak bunu yapmanın bir yolu var mı? Bir an için kapalı dikkate alınmadığında, I, tipik olarak, bu gibi curried fonksiyon değerlerini geç
scala> val sum2 = (a: Int) => (b: Int) => a + b
sum: (Int) => (Int) => Int = <function1>
Bununla birlikte, ikinci yaklaşımda işlev imzası çok farklı (tımar açıkça ifade ediliyor) 'dir. Sadece çok mantıklı değil b örtülü anahtar kelime ekleyerek ve derleyici yanı yakınır:
scala> val sum2 = (a: Int) => (implicit b: Int) => a + b
<console>:1: error: '=>' expected but ')' found.
val sum2 = (a: Int) => (implicit b: Int) => a + b
^
Ayrıca bir işlev değeri de sorunlara neden olmaktadır almak çok birinci yaklaşımından toplamını kısmen uygulanması:
scala> val sumFunction = sum _
<console>:14: error: could not find implicit value for parameter b: Int
val sumFunction = sum _
^
Bu, örtük parametrelere sahip işlevlerin, işlev değeri daha sonra uygulandığında değil, işlev değeri oluşturulduğunda belirtilen parametrelere sahip olması gerektiğine inanmamı sağlar. Bu gerçekten böyle mi? İşlev değeri olan örtülü bir parametre kullanabilir misiniz?
Yardımın için teşekkürler!
Ne yazık ki, sizin için bir cevap yok, ama açıklayıcı sorum var: İkinci paragrafta bir 'sum' * fonksiyonu * bahsetmek ancak karşılık gelen kod örneği' sum' gösterir *yöntem*. Hangisini demek istiyorsun? –
Merhaba Jörg - Anlayışım, bir metodun sadece bir sınıf veya nesne ile ilişkilendirilmiş bir işlev olmasıdır. Yukarıdaki tüm fonksiyonlar Scala REPL içine yazılmıştır; kullanıcı tanımlı sınıf veya nesne oluşturulmadı. Yani sadece burada fonksiyonlarla uğraştığımızı söyleyebilirim. – shj