gpt4 book ai didi

scala - 为什么Scala不从泛型类型参数推断类型?

转载 作者:行者123 更新时间:2023-12-04 03:44:04 25 4
gpt4 key购买 nike

假设这个功能

def func[A](data: List[A], mapper: A => String) = { 
data.map(item => mapper(item))
}

为什么此代码无法编译:
val list = List(1, 2, 3)
func(list, a => a.toString)

但这确实做到了:
val list = List(1, 2, 3)
func[Int](list, a => a.toString)

或者
val list = List(1, 2, 3)
func(list, (a: Int) => a.toString)

虽然 a类型可以从 ListInt的列表中推断出来。为什么scala不能在这里推断类型?

还有其他办法吗?

最佳答案

还有另一种方法!它也恰巧产生了一些漂亮的合成糖:

def func[A](data: List[A])(mapper: A => String) = data map mapper

看起来像:
func(myList){
case Left(one) => one
case Right(_) => default
}

无法使类型信息按预期方式流动的原因是,Scala中的类型信息是从左到右的。在其他系统中,类型信息是已知的,并在定义它的地方推导使用。有时您必须解决这些限制,但是同时,在这种情况下,您可以使用类似于您自己定义的控制结构的东西。

所以...
func[Int]( //I've just told the typer what the information is and it can flow to the right.
func(list //the typer has to deduce the type and without a guide can not figure out what a => a.toString should be

这也是一个古老的“问题”,您可以在这里 SI-4773看到。

对评论Q的回复:

如果您想拥有一个 Seq[A => B],那么我会做类似的事情
func[A, B](data: List[A])(actions: A => B*) = actions map { 
data map
}

它使用varargs(转换为 WrappedArray,因此翻译为 map)来接受任何命令列表,以便您可以通过
func(list)(_.name, _.age, _.sex, _.stalker)

尽可能地对传入的内容进行提取和匹配:
func[A, B](data: List[A])(actions: (String, A => B)*) = actions map { 
case (name, f) => (name, data map f)
}

其中您使用 case语句对模式进行匹配并提取元组。

关于scala - 为什么Scala不从泛型类型参数推断类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21147001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com