У меня возникают некоторые проблемы, когда я хочу использовать неявные методы для преобразования функции во что-то другое.
Я реализую небольшой DSL в Scala 2.8 для целей тестирования.Он должен поддерживать различные проверки (утверждения, если хотите) на экземплярах.Весь DSL немного сложен, но следующий упрощенный пример показывает мою проблему:
object PimpMyFunction {
class A(val b: Int)
def b(a: A) = a.b
class ZeroCheck(f: A => Int) {
def isZeroIn(a: A) = f(a) == 0
}
implicit def fToCheck(f: A => Int): ZeroCheck = new ZeroCheck(f)
def main(args: Array[String]) {
val a0 = new A(0)
val a1 = new A(1)
println(fToCheck(b).isZeroIn(a0))
println(fToCheck(b).isZeroIn(a1))
println(b.isZeroIn(a0))
}
}
Первые две строки println (когда я явно вызываю метод преобразования) компилируются и работают нормально, но последняя (когдаЯ хочу полагаться на имплициты) выдает ошибку:
Compile error: missing arguments for method b in object PimpMyFunction; follow this method with '_' if you want to treat it as a partially applied function
Если я хочу неявно конвертировать "нормальные" экземпляры (которые не являются функциями) так же, как это также работает, так что я думаю, что проблема не всвязанные с определением объема / импортом.
Если я следую инструкциям, приведенным в сообщении об ошибке, и использую println((b _).isZeroIn(a0))
, оно также работает, но DSL ориентирован на не технических специалистов, поэтому я хотел бы сохранить синтаксис как можно более чистым и простым.
Я думаю, у меня есть другой обходной путь (b должен быть классом, расширяющим черту Assertions, которая уже содержит методы проверки + A => Int), который бы поддерживал более чистый синтаксис, но он был бы более подробным и менее гибкимпоэтому я бы предпочел неявный способ.
Есть идеи, как избежать синтаксиса (b _)
и при этом использовать импликации?