加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么scala不会从泛型类型参数推断出类型?

发布时间:2020-12-16 09:00:38 所属栏目:安全 来源:网络整理
导读:假设这个功能 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,3)func[Int](list,a = a.toString) 要么
假设这个功能

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,3)
func[Int](list,a => a.toString)

要么

val list = List(1,(a: Int) => a.toString)

虽然可以从列表中推断出类型,这是列表的Int.为什么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,因此映射)接受任何命令列表,以便您可以通过

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语句来模式匹配并提取元组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读