2012-03-01 36 views
0

我有一些像這樣的代碼:

case class FunctionCommand[A](function: Function1[Array[A], Unit]) 

class MyClass(commands: List[FunctionCommand[_]]) { 
    def foo(parametersForEachFunction: Seq[Array[_]]) { 
    assert(commands.size == parametersForEachFunction.size) 
    for ((command, parameter) <- commands zip parametersForEachFunction) { 
     command.function(parameter) 
    } 
    } 
} 

而且這不會編譯:

MyClass.scala:7: type mismatch; 
found : Array[(some other)_0(in value $anonfun)] where type (some other)_0(in value $anonfun) 
required: Array[_0(in value $anonfun)] where type _0(in value $anonfun) 
     command.function(parameter) 
         ^

我不知道什麼是Array[(some other)_0(in value $anonfun)]。我可以寫一些類似command.function(parameter.asInstanceOf[????])的文件來編譯它嗎?

我有一個解決方法。我將command.function(parameter)更換爲:

def forceInvoke[A](command: FunctionCommand[A], parameter: Any) { 
    command.function(parameter.asInstanceOf[A]) 
} 
forceInvoke(command, parameter) 

然後編譯。

但我仍然想知道是否有方法將parameter轉換爲行內正確的類型。

+0

使用您的解決方法。你的目標是使Scala類型系統能夠克服你想要的靈活性。 – huynhjl 2012-03-01 08:03:18

+0

你不能丟失類型,然後想要回來。如果你想要類型,不要在任何地方使用'_'。如果你想要一個不同的已知類型的列表,那麼你需要一個'HList'。在這種情況下請參閱[無形](https://github.com/milessabin/shapeless)。 – 2012-03-01 16:25:04

+1

我是一名工程師,而不是數學家。我的鍵盤上沒有「λ」,「ℤ」,「⊤」等。 – 2012-03-02 04:05:35

回答

1

它足以把它寫這樣的:

for ((command: FunctionCommand[_], parameter) <- commands zip parametersForEachFunction) { 
    command.function(parameter) 
} 
+1

這種方式對於Scala 2.9.1是可以的,但是會導致Scala 2.10-M2的警告: 'MyClass.scala:6:從樹中存在的Skolem類型錯誤中恢復,類型爲Array [_ $ 1]的temp3.function() =>單元 預期類型= Array [_ $ 1] =>單元 context = var temp5:Array [_ $ 1] => Unit = temp3.function() for((command:FunctionCommand [_],parameter)< - 命令zip參數ForEachFunction){ ' – 2012-03-04 03:10:19

3

你的問題是你的FunctionCommand#function需要一個正確參數化的數組,而你不能證明parametersForEachFucntion中的參數是正確的類型。由於類型擦除,您無法在運行時執行此操作。

下工作,放棄參數(雖然這是有效的,你在你的其他問題之前剛剛什麼):

case class FunctionCommand(function: Function1[Array[_], Unit]) 

class MyClass(commands: List[FunctionCommand]) { 
    def foo(parametersForEachFunction: Seq[Array[_]]) { 
    assert(commands.size == parametersForEachFunction.size) 
    for ((command, parameter) <- commands zip parametersForEachFunction) { 
     command.function(parameter) 
    } 
    } 
} 

val fc = FunctionCommand(xs => xs foreach println) 
val mc = new MyClass(List(fc)) 

scala> mc.foo(List(Array(1,2,3))) 
1 
2 
3 
+0

爲什麼在'FunctionCommand'沒有類型參數時可以工作? – 2012-03-01 04:58:08

+0

的解決方案是不適合我接受的,因爲我需要與不同類型的參數元素的'List',但'VAL MC =新MyClass的(列表(FunctionCommand {(_:數組[字符串])的foreach的println},FunctionCommand {( _:Array [Int])foreach println}))'不能編譯。 – 2012-03-01 05:01:53