SORU
28 Aralık 2011, ÇARŞAMBA


Scala kısmi fonksiyonları - nasıl çalışır?kullanarak

Scala yeniyim, 2.9.1, ve kısmi işlevleri kullanmak için nasıl etrafında başımı almak için çalışıyorum kullanıyorum. Körili fonksiyonları temel bir anlayış var, ve kısmi fonksiyonları sadece 2nary ya da öyle oldukları yerde biraz körili fonksiyonları gibi olduğunu biliyorum. Anlayacağınız gibi biraz bu yeşil ediyorum.

XML gibi bazı durumlarda filtreleme, kısmi fonksiyonları için güçlü olmak bunları kullanmak için nasıl daha iyi anlamak umuyorum son derece yararlı olacak gibi görünüyor.

Special yapısını kullanan bir işlevi var, ama bu iki argüman, Special yapısı sadece bir tane alır ise, YA da kısmi bir fonksiyon ile çalışmak istiyorum. Bu yararlı olmayı düşünüyorum durumlardan biri olduğunu düşünüyorum.

Herhangi bir tavsiye, akıl vb kelimeleri bağlar. hoş geldiniz!

Cevapları şu ana kadar mükemmel, ve ben birkaç temel yanlış temizlendi. Onlar da mücadele ediyorum - belki de yeni bir soru biraz daha spesifik olmak ilanıyla yardımcı olacak, ben de öyle yapacağım sanırım açıklamama sanırım.

CEVAP
28 Aralık 2011, ÇARŞAMBA


Kısmi bir işlevi geçmek isteyebilirsin, bu türdeki değerlerin yalnızca bir alt kümesi için geçerli olan bir işlevdir. Örneğin:

val root: PartialFunction[Double,Double] = {
  case d if (d >= 0) => math.sqrt(d)
}

scala> root.isDefinedAt(-1)
res0: Boolean = false

scala> root(3)
res1: Double = 1.7320508075688772

Bu işlev tanımlı olup olmadığını kontrol etmek için nasıl bildiği bir şey varsa ya da faydalı değildir. Toplamak, örneğin:

scala> List(0.5, -0.2, 4).collect(root)   // List of _only roots which are defined_
res2: List[Double] = List(0.7071067811865476, 2.0)

Budeğilsize yardım edecek gerçekten bir tane istiyorum. iki bağımsız değişken yer

Buna karşılık, birkısmen işlev uygulanırbazı argümanları zaten doldurulmuş bir fonksiyonudur.

def add(i: Int, j: Int) = i   j
val add5 = add(_: Int,5)

Şimdi tek argüman yerine iki 5 eklemek için--şeye ihtiyacı var:

scala> add5(2)
res3: Int = 7

Bunu kullanmak için bu nasıl bir örnek görebilirsiniz.

Ama eğer bu iki değişkenleri belirtmek gerekirse, buhala--örneğin map kullanmak istediğiniz, söylemek ve bir bağımsız değişken bir işlev kazandırmak için ihtiyacınız olmaz, ama iki farklı şey eklemek istiyorum. O zaman

val addTupled = (add _).tupled

kısmen fonksiyon (gerçekten, sadece bu yöntem dışında bir işlevi oluşturmak, o zamandan beri hiçbir şey doldurulmuş) uygulamak ve bir demet halinde ayrı bağımsız kombine edilecek. Şimdi tek bir değişken türü doğru olduğunu varsayarak) gerektiren yerlerde kullanabilirsiniz:

scala> List((1,2), (4,5), (3,8)).map(addTupled)
res4: List[Int] = List(3, 9, 11)

Buna karşılık,tımaryine farklıdır; A => B => C formun fonksiyonları (A,B) => C döner. Yani, belirli bir işlevi birden çok bağımsız değişken, üretecek zinciri fonksiyonları her bir bağımsız değişken ve sonuç zinciri bir kısa (bence kısmen uygulayarak bir tartışma hiç bir zaman).

val addCurried = (add _).curried

scala> List(1,4,3).map(addCurried)
res5: List[Int => Int] = List(<function1>, <function1>, <function1>)

scala> res5.head(2)   // is the first function, should add 1
res6: Int = 3

scala> res5.tail.head(5)   // Second function should add 4
res7: Int = 9

scala> res5.last(8)  // Third function should add 3
res8: Int = 11

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006
  • FusioNGamiing

    FusioNGamiin

    10 Temmuz 2007