函数–函数字面量的一些简化写法及报错解析

scala 下划线解析报错: missing parameter type for expanded function

本文首先介绍下eta-expansion概念,以及其对下划线的expand的解析规则和匿名函数简写注意事项,最后通过例子解析加深读者的理解

eta-expansion概念: 把 x => func(x) 简化为 func _ 或 func 的过程称为 eta-conversion 把 func 或 func _ 展开为 x => func(x) 的过程为 eta-expansion Eta Expansion的就近expand解析原则: Underscores extend outwards to the closest closing Expr : top-level expressions or expressions in parentheses

匿名函数简写注意事项:

所以当匿名函数有多个括号嵌套的时候,不要使用_的简写方式 ,而应该用普通匿名函数的书写方式。比如 (x:Int,y:Int)=> (x*2)+f(y+2)

例子解析:

例子1: scala> List(1,2,3).map(_*2) res6: List[Int] = List(2, 4, 6)

scala> List(1,2,3).map(_*2+1) res14: List[Int] = List(3, 5, 7)

但是吧*2 换成(2) 则出错,因为根据就近原则 _2 会在最近的括号中解析成匿名函数 为(x$1) => x$1.$times(2), 变成为(x=>x2) +1 , 而期望的是(x)=>(x2)+1 scala> List(1,2,3).map((*2)+1) <console>:8: error: missing parameter type for expanded function ((x$1) => x$1.$times(2)) List(1,2,3).map((*2)+1) ^

如果括号内只有_ 本身,则本身构不成一个表达式expressions,所以如下是允许的 scala> List(1,2,3).map(()+1) res8: List[Int] = List(2, 3, 4)


例子2:

scala> List(1,2,3,4).foreach(print _) 1234

_本身构不成一个表达式:expressions,所以如下是允许的

scala> List(1,2,3,4).foreach(print(_)) 1234

(.toString) 是一个在括号()里的表达式,会expand解析成匿名函数,而print期望的String类型的值,所以编译报错 scala> List(1,2,3,4).foreach(print(.toString)) <console>:8: error: missing parameter type for expanded function ((x$1) => x$1.toString) List(1,2,3,4).foreach(println(_.toString)) ^


例子3:

val myStrings = new ArrayString// do some string initialization// this works myStrings.foreach(println())// ERROR: missing parameter type for expanded function myStrings.foreach(println(.toString))

It expands to: myStrings.foreach(println(x => x.toString))

You want: myStrings.foreach(x => println(x.toString))

The placeholder syntax for anonymous functions replaces the smallest possible containing expression with a function.


**keywords:error: missing parameter type for expanded function **

Eta Expansion

The usage of placeholder syntax for anonymous functions is restricted to expressions.

参考如下:


This has already been addressed in a related question. Underscores extend outwards to the closest closing Expr

. http://stackoverflow.com/questions/4701761/why-do-i-get-a-missing-parameter-for-expanded-function-in-one-case-and-not-the

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏较真的前端

关于数据类型转换的面试题总结

2405
来自专栏柠檬先生

Java 基础标识符

标识符: 程序员为自己定义的类,方法或者变量等起的名称。     标识符由大写字母,数字,下划线(_)和美元符号组成,但不能以数字开头。 Java 语言中严格区...

2105
来自专栏编程

python(二)—选择和循环结构

python(二)—选择和循环结构 一、选择结构 选择结构有三种,分别为单分支,双分支,多分支选择结构 if语句的执行过程是:计算表达式的值,若值为true,则...

2405
来自专栏程序员同行者

python strip() lstrip() rstrip() 使用方法

1334
来自专栏前端学习心得

浅拷贝与深拷贝

数据分为基本数据类型(String, Number, boolean, Null, Undefined,Symbol)和对象数据类型。

921
来自专栏python学习之旅

JS笔记(二):对象

1523
来自专栏乐百川的学习频道

Golang学习笔记 结构体和指针

Golang是一门很特殊的语言,虽然它出生比较晚,但是在很多地方却和现在的编程语言有所不同。现在的编程语言要么是函数式的、要么是面向对象的,而Go语言却有指针、...

2139
来自专栏Python

函数相关知识汇总

一.函数的定义 定义函数的规则: 1.定义:def 关键词开头,空格之后接函数名称和圆括号()。 2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分...

2595
来自专栏黑泽君的专栏

java基础学习_面向对象(上)02_day07总结

============================================================================= ==...

751
来自专栏程序员互动联盟

【面试宝典】C++中const关键字的用法

对于刚毕业的应届生来说面试中经常被问到const关键字的用法,小编在这里为大家总结如下: 修饰常量 用const修饰的变量某种意义上就是常量,编译器会对它进行...

2655

扫码关注云+社区

领取腾讯云代金券