По моему скромному мнению, неявные функции становятся намного труднее читать потом. Даже при чтении моего старого кода иногда бывает непонятно, когда у объектов есть методы, которые появляются на ровном месте.
Мне еще предстоит увидеть случай, когда о последствиях легче рассуждать, чем о декларативных функциях:
val failedGroup : FaultTolerantServiceGroup => Boolean = _.forall(_.failed())
Результирующий код не выглядит ни лучше, ни хуже, чем подразумевается, но, по крайней мере, очевидно, откуда исходит функциональность:
val group : FaultTolerantServiceGroup = ???
//no implicit
val failed = failedGroup(group)
//with implicits : how does a Seq have a hasFailed method?
val failed = group.hasFailed
Явные функции также облегчают чтение Iterable
функций:
val groups : Iterable[FaultTolerantServiceGroup] = ???
val failedGroups = groups filter failedGroup