2012-07-27 65 views
2

我正在玩Scala宏使用2.10.0-M5,我不知道爲什麼編譯器認爲返回類型是Any而不是List[Int]。如果我刪除調用映射並返回列表(將宏的最後一行更改爲c.Expr(list)),它將按預期工作。此外,宏確實返回一個List[Int],編譯器不知道它。宏返回類型和更高階函數

宏定義:

def test(s:String) = macro testImpl 

def testImpl(c:Context)(s:c.Expr[String]):c.Expr[Any] = { 
    import c.universe._ 
    val list = reify(List(1)).tree 

    val function = reify((x:Int) => x).tree 

    val res = 
    Apply(
     Select(
     list, 
     newTermName("map")), 
     List(function) 
    ) 

    c.Expr(res) 
} 

宏調用:

val list:List[Int] = test("") 

錯誤消息:

[error] found : Any 
[error] required: List[Int] 
[error]  val list:List[Int] = test("") 
[error]       ^
+0

我不是太熟悉新的宏系統,但不應該你的'測試Impl' return'c.Expr [List [Int]]'而不是'c.Expr [Any]'? – 2012-07-27 05:02:44

+0

在這種情況下,這將是一個選項。然而,在我的真實代碼中,返回類型取決於宏的參數,所以我不提前知道它。無論如何,如果我刪除了映射的調用,它確實與'c.Expr [Any]'一起工作,所以這不是問題。 – 2012-07-27 05:14:47

回答

2
+0

感謝您的關注。但是,如果是這樣的話,編譯器是不是認爲這個類型是「List [Any]」而不是「Any」? – 2012-07-27 06:31:12

+0

是的,你是對的,我仍然不明白錯誤的原因。更新答案以消除誤導性假設。 – 2012-07-27 06:33:20

+0

當您調查此問題時,您是否有任何解決方法的想法? – 2012-07-27 11:16:11