Can I turn a method which takes an implicit parameter into a function?
trait Tx
def foo(bar: Any)(implicit tx: Tx) {}
foo _ // error: could not find implic
To the best of my knowledge, implicit resolution must take place at usage site, and cannot be curried away. My own moment of disappointment was when I was trying to work around ´ExecutionContext´ proliferation in my code.
One compromise I've been considering was:
type Async[A] = ExecutionContext => Future[A]
def countFiles(root: String): Async[Int] = implicit ec =>
// ...
The ´implicit´ only holds within the function -- we have to compromise on invocation:
implicit class AsyncExt[A](async: Async[A]) {
def invoke()(implicit ec: ExecutionContext) = async(ec)
}
implicit val ec = ...
countFiles("/").invoke()
Another compromise -- the one I chose and lived to regret:
class AsyncFileCounter(ec: ExecutionContext) {
def countFiles(root: String): Future[A] = ...
}
class FileCounter {
def async(implicit ec: ExecutionContext) = new AsyncFileCounter(ec)
}
This changes the usage from the naive (but desired):
implicit val ec = ...
val counter = new FileCounter
counter.countFiles("/") // <-- nope
To the following:
implicit val ec = ...
val counter = new FileCounter
counter.async.countFiles("/") // yep!
Depending on your context, this could be bearable. You could add a ´def transactional´ where I used ´def async´.
I do regret this however, as it complicates inheritance, and incurs some allocation overhead (though that should be JITed away).
Bottom line is that you'll have to come up with a more explicit piecemeal method of invoking your function -- one that is less elegant than currying alone.