Scala中:传递函数A通过函数B的参数其中B声明一个隐式参数为函数的

问题描述:

假设我有2种方法中,A,B,和4类,C,d,E,T。Scala中:传递函数A通过函数B的参数其中B声明一个隐式参数为函数的

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) 
    ... 
} 

然后,我想用一个调用方式B作为参数

B(A) 

但有一个错误“无法在这里找到任何HTTP请求”在行B(A)

我只是想通过功能像一个参数要在中执行方法B,不是当我调用方法B.

我想声明牛逼明确这样的,它的工作原理

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

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

但我真的想让它隐含

有没有办法做到这一点??

+0

'T'从哪里来?我没有看到它在任何地方宣布。 –

+0

@YuvalItzchakov谢谢。我忘了把它放在帖子里。 –

要在呼叫站点获取B(A),像

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

应该工作(我无法检查此刻,但如果没有,请尝试B(A _))。

但你仍然在B内失去隐含性。为了避免这种情况,你需要implicit function types,这是目前斯卡拉不支持的。

+0

它的工作原理。实际上,我在fn中有一个函数,它使用t作为一个隐式参数,这就是为什么我需要它是隐式的。顺便说一句,这也帮助我。非常感谢你。 –

你试过吗?你隐需要在范围上,当你调用,所以我认为这将工作:

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

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

它不起作用。我需要在方法B中声明方法A的隐式val,所以当我调用B(A)时,没有任何隐式声明在范围中,但我也不希望方法A在B行被执行(A )。我认为它应该工作,因为我只是在B行(A)传递方法A,当我在方法B中声明隐式的val时,我会调用A. –