![](/img/trans.png)
[英]Scala Generic Function Values (Anonymous Function) - Missing Parameter Type (Error)
[英]scala anonymous function missing parameter type error
我寫了以下內容
def mapFun[T, U](xs: List[T], f: T => U): List[U] = (xs foldRight List[U]())( f(_)::_ )
當我做的時候
def f(x: Int):Int=x*x
mapFun(List(1,2,3), f)
它工作正常。 但是,我真的想做以下工作
mapFun(List(1,2,3), x=>x*x)
它抱怨“缺少參數類型”。 我知道我可以使用currying,但有沒有辦法仍然使用匿名函數進行上面的非currying def?
在我看來,因為“f”與“xs”位於相同的參數列表中,所以您需要提供有關x類型的一些信息,以便編譯器可以解決它。
在你的情況下,這將工作:
mapFun(List(1,2,3) , (x: Int) => x * x)
你看到我如何通知編譯器x是一個Int嗎?
你可以做的一個“技巧”是f。 如果您不知道什么是currying,請查看: http : //www.codecommit.com/blog/scala/function-currying-in-scala
你最終會得到一個像這樣的mapFun:
def mapFun[T, U](xs: List[T])(f: T => U): List[U] =
(xs foldRight List[U]())( f(_)::_ )
這將工作:
mapFun(List(1,2,3))(x => x * x)
在最后一次調用中,當編譯器檢查第一個參數列表時,將解析x的類型。
編輯:
正如Dominic指出的那樣,你可以告訴編譯器你的類型是什么。 導致:
mapFun[Int, Int](List(1,2,3), x => x * x)
干杯!
你正在運行到這里Scala的類型系統的限制是類型信息來自全國各地的參數組,左到右流動,從一個參數組中從左到右不流動。
這意味着通過提供List[Int]
來指定類型參數T
將不會將該信息提供給組內的其他參數,如f
。 這導致缺少參數類型錯誤。 但如果f是下一個參數組的一部分,它將提供給f
。 這就是curry函數方法的工作原理。
即如果你這樣定義:
def mapFun[T, U](xs: List[T])(f: T => U): List[U] = (xs foldRight List[U]())( f(_)::_ )
您在第一個參數組中定義的類型參數T
: (xs: List[T])
作為Int
將可用於下一個參數組: (f: T => U)
。 所以現在您不必在呼叫站點明確指定T
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.