2016-03-19 27 views
4

Aşağıdaki iki üst düzey işlev aynı sonucu verir, ancak ikisi arasındaki farkı anlamada sorun yaşıyorum. Aslında, anlamıyorum 1). Bir fonksiyonun () iki seti nasıl olabilir?Bu iki üst düzey işlev nasıl farklı?

1)

def sum(f: Int => Int) (a: Int, b: Int) = { 
    def loop(a: Int, acc: Int) : Int = 
     if (a > b) acc 
     else loop (a + 1, f(a) + acc) 
    loop (a, 0) 
} 

2)

def sum(f: Int => Int, a: Int, b: Int) = { 
     def loop(a: Int, acc: Int) : Int = 
     if (a > b) acc 
     else loop (a + 1, f(a) + acc) 
     loop (a, 0) 
} 
+0

Scala fonksiyonlarının birden fazla parametre listesi olabilir ('toplam' ilk tanımında olduğu gibi). Bkz. Http://docs.scala-lang.org/tutorials/tour/currying.html – Jubobs

+0

Bkz. Http://stackoverflow.com/questions/36314/what-is-currying –

cevap

3

ilk fonksiyon Körili olup. Anlamı kısmen daha kolay uygulayabilirsiniz. Sadece ilk parametre listesini kullanırsanız, işlev (Int, Int) => Int imzasıyla başka bir işlev döndürür.

Bu, map veya reduce gibi üst düzey işlev işlevlerine belirli bir işlev imzası olan bir işlevi iletmeniz gerektiğinde gerçekten kullanışlıdır.

Haskell gibi diğer işlevsel programlama dillerinde, tüm işlevler varsayılan olarak körelir. İlgilendiğinizde bu konuyla ilgili bir blog yazısı yazdım. Okumaktasınız right here.

+0

Blog bağlantınızı gönderir misiniz? Teşekkürler – johnsam

+0

İşte orada :) –

+0

Yani sadece 2) yüksek sipariş fonksiyonu. Ve 1) değil mi? 1) bunun yerine köreliyor mu? – johnsam

İlgili konular