2010-04-27 9 views
4

Ces deux déclarations de fonctions sont-elles effectivement différentes?Déclarer des fonctions de deux façons. Quelle est la distinction?

Sinon, pourquoi ont-ils des valeurs toString différentes?

scala> def f: (Int) => Int = x=> x*x 
f: (Int) => Int 

scala> def f(x: Int) = x*x 
f: (Int)Int 
+0

ce n'est pas une réponse, mais je suppose que le second a le type de retour déduit et c'est la différence, car afaik Scala a une surcharge d'opérateur ce qui signifie que x * x ne doit pas être un Int. –

+3

@Gabriel: Non, il n'y a pas de vérité là-dedans. –

Répondre

18

Le premier est un procédé sans argument f1 qui renvoie un Function1[Int, Int].

scala> def f1: (Int => Int) = (x: Int) => x * x 
f1: (Int) => Int 

La seconde est une méthode d'argument une f2 qui prend un un Int et renvoie un Int.

scala> def f2(x: Int): Int = x * x 
f2: (x: Int)Int 

Vous pouvez appeler f1 et f2 avec la même syntaxe, bien que lorsque vous appelez f1(2) il est étendu à f1.apply(2).

scala> f1 
res0: (Int) => Int = <function1> 

scala> f1(2) 
res1: Int = 4 

scala> f1.apply(2) 
res2: Int = 2 

scala> f2(2) 
res3: Int = 4 

Enfin, vous pouvez 'lift' la méthode f2 à une fonction comme suit.

scala> f2 
<console>:6: error: missing arguments for method f2 in object $iw; 
follow this method with `_' if you want to treat it as a partially applied funct 
ion 
     f2 
    ^

scala> f2 _ 
res7: (Int) => Int = <function1> 

scala> (f2 _).apply(2) 
res8: Int = 4 

exercice: Quel est le type de f1 _?

+0

Une fonction sans argument, renvoyant une fonction qui convertit Int en Int. scala> f1 _ RES6:() => (Int) => Int = Il est intéressant que nous pouvons garder "lifting" ... scala> RES6 _ res7:() =>() => (Int) => Int = scala> res7 _ res8:() =>() =>() => (Int) => Int = scala> res8()()() (9 res9: Int = 81 Merci pour l'info @retronym. L'exercice est une belle touche! – Synesso

+0

BTW, le terme précis pour cette conversion dans Scala est Eta Expansion. Voir '6.7 Méthodes Valeurs' et '6.25.5 Eta Expansion' sur http://www.scala-lang.org/docu/files/ScalaReference.pdf – retronym

4

Ce sont des déclarations de méthodes, pas des déclarations de fonctions. La première méthode renvoie une fonction, la seconde renvoie un Int et n'a rien à voir avec les fonctions.

Voir this question.

Questions connexes