2014-10-03 3 views
0

Я в настоящее время использую псевдоним типа:Declare переменного типа, является функцией возвращаемого типа

type FooType = Int 
val foo = (_: Int) * 2 

def takeFooRet(x: FooType) = ... 

однако, я хотел бы сделать что-то вроде:

val foo = (_: Int) * 2 

def takeFooRate(x: foo.RetType) = ... 

Я не видя что-нибудь в Function1. Это невозможно?

+0

'Function1' не имеет абстрактного типа, поэтому я думаю, вам понадобится неявное преобразование, а реализация будет макросом. –

ответ

1

Вы должны знать тип входа или параметризуем ваш «takeFooRate» с некоторым типом

def takeFooRate[+Out](x: Int => Out) = ... 

или

def takeFooRate[-In,+Out](x: In => Out) = ... 
+0

ну, он должен знать тип :) –

3

Это не невозможно, но вы должны Function1 выставить тип возвращаемого как тип участник. К сожалению, это не так, но вы можете обернуть Function1 во что-то, что даст вам необходимую информацию. Вот тривиальный пример

class Function1Aux[T1, R](f: Function1[T1, R]) { 
    type Out = R 
} 

val foo = new Function1Aux((_: Int) * 2) 

def takeFooRate(x: foo.Out) = x 

Я понимаю, что это не очень, но это показывает, что это технически возможно.

+0

Ну, тогда вы можете просто добавить 'implicit def Fn1ToAux [A, B] (f: Function1 [A, B]): Function1Aux [A, B] = new Function1Aux [A, B] (f) 'и используйте ваши обычные функции – laughedelic

+0

@laughdelic, если это сработает, вы можете просто заменить' class' 'неявным классом' и выполнить с ним, но, видимо, доступ к члену типа недостаточно, чтобы вызвать неявное преобразование. –

Смежные вопросы