2016-12-13 2 views
1

j'ai essayé de mettre en œuvre une fonction similaire à:inférence automatique argument de type dans scala

def myMap[A,B](a: Seq[A], f: A => B): Seq[B] = a.map(f) 

// then I want to call it like that: 
myMap(List(1,13,42), _*2) 

Mais l'appel à myMap ne compile pas parce que le compilateur ne peut pas déduire les arguments de type A et B. Erreur: missing parameter type

Fondamentalement, j'espère qu'il déduirait A (Int) argument donné List(1,13,42) déduire ensuite B de donnée f = _*2 sachant A. Mais ce n'est pas le cas.

Que pourrais-je faire pour éviter d'écrire les arguments de type?

Le meilleur que j'ai trouvé:

def myMap[A,B](a: Seq[A], f: A => B): Seq[B] = a.map(f) 
myMap(List(1,13,42), (a: Int) => a*2) 

à savoir Je donne explicitement A dans l'argument f

Répondre

7

Utilisez des listes de paramètres multiples.

def myMap[A,B](a: Seq[A])(f: A => B): Seq[B] = a.map(f) 

// then call it like this: 
myMap(List(1,13,42)) (_*2) 

Le api de collecte fait un usage intensif de ce style pour foldLeft et des fonctions similaires. Vous pouvez consulter le guide de style officiel here.

+1

Je préfère finalement ma solution ci-dessous. Mais le vôtre répond mieux à la question –

0

J'ai trouvé un moyen, en utilisant la classe implicite:

implicit class MyMap[A](a: A) { 
    def myMap[B](f: A => B): B = f(a) 
} 

// then I can call 
List(1,13,42).myMap(_*2)