Как я могу улучшить вывод типа Scala с параметрами типа, которые не отображаются в первом списке параметров ?

Чтобы проиллюстрировать мою точку зрения, вот пример:

abstract class Wrapper[A](wrapped: A) {

  protected def someCondition: Boolean

  def fold[B](whenTrue: => B)(whenFalse: => B): B =
    if (someCondition) whenTrue else whenFalse

}

Я пытаюсь добавить метод fold на основе произвольного условия, определенного для обернутого типа A . Проблема с приведенным выше кодом заключается в том, что он не будет компилироваться, хотя предположительно может вернуть Any :

wrapper.fold("hi")(42)

, потому что к тому времени, когда компилятор достигнет второго списка параметров, B уже был выведен как String . Предположим, нам не нужно писать аннотацию типа. Мы можем попробовать изменить fold на это:

def fold[B, B0 >: B](whenTrue: => B)(whenFalse: => B0): B0

, но это также не работает, поскольку B0 уже был разрешен как String в конце первого списка параметров, хотя он вообще не отображается в нем! Простое решение, конечно, состоит в том, чтобы иметь единственный список параметров, но для примера, допустим, я хочу сохранить два списка параметров и попытаться заставить их работать ... В идеале мы должны иметь возможность задержка разрешение B0 . Было бы здорово, если бы мы могли написать что-то вроде этого:

def fold[B](whenTrue: => B)[B0 >: B](whenFalse: => B0): B0

Но, к сожалению, это не работает. Есть ли обходные пути?

(Я даю первый ответ, но я, конечно, ищу и другие обходные пути.)

6
задан Jean-Philippe Pellet 5 August 2011 в 09:52
поделиться