2012-06-10 13 views
10

Ben curried fonksiyonu ile ilgili bazı sorularım var. Burada onlara tek tekCurried fonksiyon ile ilgili sorular Scala

1) http://twitter.github.com/scala_school/basics.html'un curried işlevinin bir örneğini göstermesini istiyorum - bunun bir işlev tanımı olduğunu düşündüm, ama aslında değil. REPL bunu herhangi bir geçerli beyan olarak kabul etmemektedir.

multiplyThenFilter { m: Int => m * 2 } { n: Int => n < 5} 

2) Neden bir işlevi kısmen parametrelenmiş yöntemden tanımlayamıyoruz? yani, aşağıdaki tanımdaki sorun nedir?

scala> def multiply(m: Int, n: Int): Int = m * n 
multiply: (m: Int, n: Int)Int 

scala> val timesTwo = multiply(2,_) 
<console>:11: error: missing parameter type for expanded function ((x$1) => multiply(2, x$1)) 
     val timesTwo = multiply(2,_) 
           ^

3) Neden kısmen parametrelenmiş bir işlevi curried yapamıyoruz? yani, aşağıdaki tanımdaki sorun nedir?

scala> (multiply(_,_)).curried 
    res13: Int => (Int => Int) = <function1> // THIS IS OK 

scala> (multiply(20,_)).curried 
<console>:12: error: missing parameter type for expanded function ((x$1) => multiply(20, x$1)) 
       (multiply(20,_)).curried 
         ^
+0

1) Bu geçerli değildir, çünkü önce bildirilmesi gerekir. Örneğin, bunun gibi: 'def multiplyThenFilter (a: Int => Int) (b: Int => Boolean) = {Liste (1,2,3,4) .map (a).filter (b)} ' –

+0

1) multiplyThenFilter şimdi gitti. Onunla karıştırılan tek kişi siz değildiniz :-) –

cevap

11

Soru 1 Scala Okulu örnek kafa karıştırıcı-kesinlikle bir tanım olmaması. GitHub'da bunun için açık olan an issue var, belki bu bir hatadır. Eğer makul bir tanım şöyle olabilir tahmin edebilirsiniz:

(eşit biçimde Veya, f andThen (Some(_) filter p).)
def multiplyThenFilter(f: Int => Int)(p: Int => Boolean): Int => Option[Int] = { 
    i => 
    val j = f(i) 
    if (p(j)) Some(j) else None 
} 

Sonra örnek girişini ikiye katlar ve bu kadar eğer bir Some sonucu döndüren bir fonksiyon olacaktır Aksi takdirde 5'ten az ve None. Fakat kimse, yazarın bu konuya bir cevap verene kadar ne istediğini tam olarak bilmiyor.


Soru 2

sizin timesTwo Scala derleyici ilgili detay biraz this question ve my answer there çıkarım görülmesi tip bu tür desteklemiyor sadece budur çalışmıyor sebebi. Aşağıdakilerden biri ile gitmek gerekir:

def multiply(m: Int, n: Int): Int = m * n  
val timesTwo = multiply(2, _: Int) 

def multiply(m: Int)(n: Int): Int = m * n  
val timesTwo = multiply(2) _ 

yanı, burada tip çıkarımlar istiyorsanız Birden parametre listelerini kullanmak gerekir. Aksi halde derleyiciye türüyle yardım etmelisiniz.


üçüncü soru için Soru 3

, elimizdeki varsayalım ikinci söz konusu sorunu önlemek için aşağıdaki:

val timesTwo = multiply(2, _: Int) 

Bu Function1, sadece gelmez' Bir curried yöntemine sahip olmalısınız — bunun için bir Function2 (veya Function3, vb.) gerekir.

Tek bir argümanla bir işlevi karıştırmak hakkında konuşmak mantıklı değildir. Currying, çoklu argümanlarla bir fonksiyon alır ve size başka bir işlevi döndüren tek bir argümanı (bir fonksiyonun kendisi muhtemelen tek bir argüman alır ve başka bir fonksiyon döndürür) verir.

+0

, "val timesTwo = multiply (2, _: Int)" ve "val timesTwo = multiply (2) _" ifadesinde tanımladığınız iki fonksiyonun 'timesTwo'dur. Aynı tipte 2. soruya mı? – chen

+0

Evet, ikisi de Int => Int' (veya eşdeğeri 'Function1 [Int, Int]'). –