2017-07-18 1 views
0

Supposons que j'ai 2 méthodes, A, B et 4 classes, C, D, E, T.Scala: function passer un comme un paramètre par la fonction B où B déclare un paramètre implicite pour la fonction A

def A(c: C)(implicit t: Request[T]): D { ... } 

def B(fn: C => D): E { 
    implicit val t // I have to declare implicit val for A here 
    fn(c) 
    ... 
} 

Ensuite, je veux appeler la méthode B avec a comme paramètre

B(A) 

Mais il y a une erreur « Impossible de trouver requête HTTP ici » à la ligne B (a)

Je veux juste passer la fonction Un comme un paramètre à exécuter dans méthode B, pas quand j'appeler la méthode B.

J'ai essayé de déclarer explicitement t comme ça, cela fonctionne

def A(c: C, t: Request[T]): D { ... } 

def B(fn: C => D): E { 
    fn(c, t) 
    ... 
} 

Mais je veux vraiment faire implicite

Est-il possible de le faire ??

+0

D'où vient le 'T'? Je ne le vois pas déclaré nulle part. –

+0

@YuvalItzchakov Merci. J'ai oublié de le mettre dans le post. –

Répondre

1

Pour obtenir B(A) sur le site d'appel, quelque chose comme

def B(fn: C => Request[T] => D): E = { 
    val t = ... // no point making it implicit unless you use it elsewhere 
    fn(c)(t) 
    ... 
} 

devrait fonctionner (je ne peux pas vérifier pour le moment, mais si ce n'est pas le cas, essayez aussi B(A _)).

Mais vous perdez encore de l'implicite à l'intérieur de B. Pour éviter cela, vous aurez besoin de implicit function types, ce que Scala actuel ne supporte pas.

+0

Cela fonctionne. En fait, j'ai une fonction dans fn qui utilise t comme un paramètre implicite, c'est pourquoi j'ai besoin qu'il soit implicite. Btw cela m'aide aussi. Merci beaucoup. –

0

Avez-vous essayé? Vos besoins implicites d'être portée lorsque vous appelez A, donc je pense que cela va fonctionner:

def A(c: C)(implicit t: Request[T]): D { ... } 

def B(fn: C => D)(implicit t: Request[T]): E { 
    fn(c) 
    ... 
} 
+0

Cela ne fonctionne pas. J'ai besoin de déclarer implicitement val pour la méthode A dans la méthode B, donc je n'ai pas d'implicite déclaré dans une portée quand j'appelle B (A) mais je ne veux pas non plus que la méthode A soit exécutée sur la ligne B (A). Je pense que cela devrait fonctionner parce que je viens de passer la méthode A à la ligne B (A) et j'appellerai A quand je déclare implicit val à l'intérieur de la méthode B. –