簡體   English   中英

scala匿名函數缺少參數類型錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM