2016-02-21 39 views
1

我想調用一個帶有隱式參數的函數返回的函數,簡單而優雅。這不起作用:試圖跳過隱式參數列表

def resolveA(implicit a: A): String => String = { prefix => 
    s"$prefix a=$a" 
} 

case class A(n: Int) 
implicit val a = A(1) 

println(resolveA("-->")) // won't compile 

我已經想通了這是怎麼回事:斯卡拉看到("-->"),並認爲這是一個企圖在隱含參數列表中明確填寫。我想通過它作爲prefix的論點,但斯卡拉認爲它是a的論點。

我已經嘗試了一些替代方法,比如在隱式參數列表之前放置一個空參數列表(),但到目前爲止,我一直被Scala認爲返回函數的參數是試圖填充隱含參數列表resolveA

什麼是一種很好的方式來做我在這裏要做的事情,即使它不如我上面嘗試的語法那麼好?

+0

@ som-snytt,隱式地在你刪除的答案中對我的真實代碼有幫助!我已經找到了解決問題的好例子。 –

回答

3

另一種選擇是使用由resolveA返回的String => String函數的apply方法。這樣編譯器不會混淆參數列表,並且比編寫implicltly[A]要短一些。

scala> resolveA[A].apply("-->") 
res3: String = --> a=A(1) 
+0

嗯,是的!這比我迄今爲止使用的解決方案好得多,這是明確地闡明隱含的參數。順便說一句,我只是注意到,我不需要'[A]'類型參數;我現在將其從問題中刪除。 (這是一個巨大簡化的真正的代碼,遍佈各處都有類型參數。) –