2017-05-21 3 views
0
scala> def sum(a:Int)(b:Int) = a+b; 
    sum: (a: Int)(b: Int)Int 

    scala> var psum = sum(5)_ 
    psum: Int => Int = $$Lambda$1035/[email protected] 

    scala> psum(23) 
    res0: Int = 28 

Die obige Snippet funktioniert gut, aber nicht sicher, warum die folgenden Code-Schnipsel complains.I gehe davon aus, dass, wenn ich für ein Argument setzen unterstreichen, ich diese Funktion Curry kannScala currying mit drei Argumenten Funktion

scala> def sum(a:Int)(b:Int)(c:Int) = a + b + c; 
    sum: (a: Int)(b: Int)(c: Int)Int 

    scala> var psum = sum(5)_(23) 

Antwort

1

Sie treffen auf eine Mehrdeutigkeit/Einschränkung des Parsers. Sie können es umgehen, indem Klammern hinzugefügt

val psum = (sum(5)_)(23) 
+0

Ihre Antwort ist falsch, wie ich hier demonstriere: '' 'def Summe (a: Int) (b: Int) (c: Int) = s" a: $ a, b: $ b, c: $ c "; val psum = (Summe (5) _) (23); psum (50) == "a: 5, b: 23, c: 50" " – pedrofurla

+0

Ist Ihnen auch klar, dass es nur die gleiche Antwort gibt, weil" + "kommutativ ist? Es hat wenig mit Auftrags- oder Funktionsanwendung zu tun. – pedrofurla

+0

Yep, es sieht jetzt falsch aus, dass ich es mir anschaue. Es reparieren, danke! –

1

Was Sie für diesen Fall brauchen, ist val psum = sum(5)(_: Int)(23). (sum(3)_)(2) wird wie folgt berechnet: sum(3)_ ist das gleiche wie (b: Int) => (c: Int) => sum(3)(b)(c) und das Anwenden auf 2 ergibt (c: Int) => sum(3)(2)(c).

+0

Oh, nette Beobachtung! – pedrofurla

0

Wenn ich mich nicht irre, suchen Sie nach teilweise angewendeten Argumenten in einer Funktion und nicht zum Curry. Sie müssten es auf diese Weise tun:

def sum(a:Int,b:Int,c:Int) = a * b + c 
    sum: (a: Int, b: Int, c: Int)Int 
sum(10, _:Int, 1) 
    res1: Int => Int = $$Lambda$1131/[email protected] 
res1 (2) 
    res13: Int = 21 
0

Dies ist eine Einschränkung der Scala-Syntax. Sie können die gleiche Semantik wie dieses Ziel zu erreichen:

scala> def sum(a:Int)(b:Int)(c:Int) = s"a: $a, b: $b, c: $c" 
sum: (a: Int)(b: Int)(c: Int)String 

scala> def flip[A,B,C](f:A => B => C): B => A => C = b => a => f(a)(b) 
flip: [A, B, C](f: A => (B => C))B => (A => C) 

scala> flip(sum(5))(23) 
res1: Int => String = <function1> 

scala> res1(50) 
res2: String = a: 5, b: 50, c: 23 

Grundsätzlich flip die Reihenfolge der binären Funktionen schalten, so können wir es das mittlere Argument machen verwenden b das letzte Argument von flip(sum(5)) sein.

(*) Ich habe mir die Freiheit genommen, Summe als eine Zeichenfolge zurückzugeben, die alle Eigenschaften abstrahiert, die für die Auftragsfunktionen-Anwendung nicht relevant sind, die ich als Kern Ihrer Frage interpretiere.