2014-10-03 55 views
0

目前我使用一個類型別名:聲明變量,其類型是一個函數的返回類型

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

def takeFooRet(x: FooType) = ... 

不過,我想這樣做:

val foo = (_: Int) * 2 

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

我不是看到任何東西Function1。這是不可能的嗎?

+0

'Function1'沒有抽象類型,所以我認爲你需要一些隱式轉換,而實現將是宏。 – 2014-10-03 01:47:46

回答

1

你需要知道輸入類型或某些類型的

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

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

以及它需要知道的類型:) – 2014-10-03 10:18:08

3

這不是不可能的參數化你的「takeFooRate」,但你需要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

那麼,你可以添加隱式def Fn1ToAux [A,B](f:Function1 [A,B]):Function1Aux [A,B] = new Function1Aux [A, B](f)'並且使用你的普通函數 – laughedelic 2014-10-03 16:06:39

+0

@如果這樣可以工作,你可以用'implicit class'替換'class'並且用它來完成,但顯然訪問一個類型成員不足以觸發隱式轉換。 – 2014-10-03 16:22:07

相關問題