2017-12-26 4 views
0

Ich entdeckte dieses interessante "Phänomen", wenn ein Funktionsliteral definiert ist, ein Tupel als seinen Eingabeparameter() aufzunehmen. Es kann auf angewendet werden 1. ein Tupel 2. eine Liste von Argumenten des gleichen Typs wie die Komponenten des TupelsWarum Funktion Literal mit einzelnen Tupel-Argument akzeptiert auch eine Liste von Argumenten?

Kann mir jemand erklären, warum das passieren kann? Eigentlich erwartete ich 2.

scala> val foo = (x:List[Int],y:Int) => x.length + y 
foo: (List[Int], Int) => Int = <function2> 

scala> val bar = (x:(List[Int],Int)) => x._1.length + x._2 
bar: ((List[Int], Int)) => Int = <function1> 

scala> foo((List(1,2,3),10)) 
<console>:13: error: not enough arguments for method apply: (v1: List[Int], v2: Int)Int in trait Function2. 
Unspecified value parameter v2. 
     foo((List(1,2,3),10)) 
     ^

scala> foo(List(1,2,3),10) 
res37: Int = 13 

scala> bar(List(1,2,3),10) 
res38: Int = 13 

scala> bar((List(1,2,3),10)) 
res39: Int = 13 

Antwort

2

Sorry, ich habe keinen Ruf, um einen Kommentar hinzuzufügen, aber ich schlage vor, Auto Tupling nachschlagen.

Der Grund

scala> bar(List(1,2,3),10) 
res38: Int = 13 

Werke ist, weil die beiden Argumente in Tupel umgewandelt werden (List (1,2,3), 10), um bar Argument Typ übereinstimmen.

Es gibt Compile-Flags, um ein solches Verhalten zu warnen (-Ywarn-adapted-args) oder abzulehnen (-Yno-adapted-args).

+0

Dank dieser half mir meine Zweifel zu klären – laiboonh

4

Sie sind ein wenig verwirrt mit dem Argument umschließenden Klammern zum Scheitern verurteilt, sind sie nicht benötigt, wenn das Argument ein Tupel:

scala> def f(x:(String, String)) = x 
f: (x: (String, String))(String, String) 

scala> f("a","b") 
res9: (String, String) = (a,b) 

scala> f(("a","b")) 
res10: (String, String) = (a,b) 

scala> f((("a","b"))) 
res11: (String, String) = (a,b) 

scala> f(((("a","b")))) 
res12: (String, String) = (a,b) 

jedoch

scala> def g(x: (Int, Int), z:Int) = z 
g: (x: (Int, Int), z: Int)Int 

scala> g((1,2),3) 
res13: Int = 3 

scala> g(1,2,3) 
<console>:9: error: too many arguments for method g: (x: (Int, Int), z: Int)Int 
      g(1,2,3) 
Verwandte Themen