Scala не обрабатывает неявно типизированные замыкания для функций ':' - PullRequest
4 голосов
/ 18 октября 2011

Итак, я хочу написать функцию, которая может быть написана так:

{ println(_) } =: thing

Здесь я хочу, чтобы она действительно выполняла thing.=:(println(_)).Скажем ради аргумента, что =: имеет следующую реализацию:

def =:(block : Int => Any) {
    block(5)
}

Итак, я пытаюсь назвать это так, как показано выше, и получаю:

<console>:10: error: type mismatch;
   found   : Unit
   required: Int => Any
             println(_) =: thing

Затем я пытаюсь сделатьэто:

thing.=:(println(_))

Таким образом, я получаю хороший 5, напечатанный на терминале.Затем я попробовал это:

{ value => println(value) } =: thing

Это снова не удалось и сказал мне, что есть «пропущенный тип параметра».Я предполагаю, что это потому, что Scala пытается сначала разобрать / скомпилировать аргумент функции в этом случае и не угадывает тип, как это было бы (я полностью догадываюсь здесь), когда он вызывается более обычным способом (соператор точки).

Может ли кто-нибудь пролить больше света на проблемы здесь, а также, может быть, предложить лучший способ достичь чего-то близкого к моей первоначальной цели?

PS Извините за название.Я переименую его, как только у меня появится лучшее понимание проблемы.

Ответы [ 2 ]

6 голосов
/ 18 октября 2011

Вывод типа работает слева направо, даже если имена символических методов формы #: в конечном итоге работают справа налево.Вы можете использовать вспомогательный метод, если вы на самом деле имеете только один тип:

def let(fi: Int => Any) = fi
case class Thing(i: Int) {
  def =:(f: Int => Any) = f(i)
}

scala> let(_+2) =: Thing(5)
res4: Any = 7

, но это не совсем удовлетворительное решение, если у вас много возможных сигнатур типов, потому что вы должны соответствовать имени вспомогательного методаслева до нужного типа справа.

1 голос
/ 18 октября 2011

Так почему бы вам не добавить тип параметра:

{ value:Int => println(value) } =: thing

Я сам не эксперт по Scala, поэтому не могу дать более глубокого объяснения того, что выводчик может сделать вывод.

...