繁体   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