Можно ли кодировать общие возвращаемые типы в Scala аналогично шаблонам C ++?

В C ++ я могу делать следующее:

template
struct{
    void operator()(T _1, V _2){
        _2.foo( _1 );
    }
};

что позволяет мне произвольно решать использовать любой объект, у которого есть метод с именем "foo", который принимает некоторый тип "T "без предварительного указания ни типа аргумента функции" foo ", ни типа возвращаемого значения указанной функции.

Когда я смотрю на Scala, вижу такие черты, как Function1 , и играю с определениями функций вроде

def foo[T<:{def foo():Unit}]( arg:T ) = //something
def bar( x:{def foo():Unit} ) = //something
def baz[T,V<:Function1[T,_]]( x:T, y:V ) = y( x )

Я смотрю на себя и думаю, почему я не могу сделать то же самое? Почему "baz" возвращает Any? Разве он не может определить фактический тип возвращаемого значения во время компиляции? Почему я должен объявлять возвращаемый тип «foo», если я могу даже не использовать его?

Я бы хотел иметь возможность делать

def biff[T,V:{def foo( x:T ):Unit}] = //something

или

def boff[T<:{def foo( x:Double ):_}]( y:T ) = y.foo _

Можете ли вы сделать это, и я просто что-то упускаю ? Или, если нет, почему бы и нет?

5
задан wheaties 17 November 2010 в 03:17
поделиться