Scala函数值作为参数

Scala函数值作为参数,scala,functional-programming,Scala,Functional Programming,在Scala第三版的编程书中。我对printWriter(新文件(“date.txt”)、a=>a.println(新java.util.date))的代码“感到困惑” 我使用scala的术语解释a=>a.println(new java.util.Date)在函数调用中,这是一个函数文本,参数是a,并映射到a.println(new java.util.Date)函数。但是withPrintWriter函数的原型需要两种类型,第一种是文件,它适合新文件(“date.txt”),而另一种是函数值

在Scala第三版的编程书中。我对printWriter(新文件(“date.txt”)、a=>a.println(新java.util.date))的代码
“感到困惑”

我使用scala的术语解释
a=>a.println(new java.util.Date)
在函数调用中,这是一个函数文本,参数是a,并映射到a.println(new java.util.Date)函数。但是withPrintWriter函数的原型需要两种类型,第一种是文件,它适合新文件(“date.txt”),而另一种是函数值,它接受PrintWriter类,返回一个单位(不有趣的结果)。我们传递给第二个参数是
a=>a.println(newjava.util.Date)
,a的类型是什么。该函数需要一个as参数,函数体是a.println(new java.util.Date)。你觉得这很奇怪吗?scala编译器如何完成这类代码

  1 import java.io._
  2 
  3 object WithPrintWriter1 {
  4   def withPrintWriter(file: File, op: PrintWriter => Unit) {
  5     val writer = new PrintWriter(file)
  6     try {
  7       op(writer)
  8     } finally {
  9       writer.close()
 10     }
 11   }
 12   def main(args: Array[String]) {
 13     withPrintWriter(
 14       new File("date.txt"),
 15     _ => _.println(1))
 16   }
 17 }
以上代码将产生错误。 scala_test/WithPrintWriter1.scala:15:错误:缺少扩展函数的参数类型((x$2)=>x$2.println(1)) _=>u.println(1))。 占位符为什么会产生错误。这是scala编译器无法推断类型的原因吗?但我们可以将子行字符替换为任何没有类型的字符,如“a”、“b”、“c”等。我很困惑

任何帮助都将不胜感激,谢谢

我尝试了这段代码,它添加了PrintWriter类型。没关系可能可以省略该类型。

而我将a替换为这样的u(u:PrintWriter),这将产生一个错误。 scala_test/WithPrintWriter2.scala:15:错误:缺少扩展函数的参数类型((x$2)=>x$2.println(new java.util.Date()) (u:PrintWriter)=>u.println(new java.util.Date) 这很有趣。 救命啊

。。。实际上是

a: PrintWriter => a.println(new java.util.Date)
编译器推断出了类型,因为它知道
withPrintWriter()
方法的第二个参数应该是type
PrintWriter=>Unit
,即函数具有
PrintWriter
类型的输入,但没有任何意义,
Unit
,结果

这不起作用,因为下划线有特殊的含义。要正确使用它,您需要编写:
.println(1)


在此上下文中,一个下划线表示:
a=>a

是的,您的答案与我的测试非常吻合。也许(类型)=>。。。模式本身是错误的,scala没有这种书写模式。我说的对吗?下划线在不同的上下文中有稍微不同的含义,但你是对的,
(\u:Type)=>\uu
是错误的。这有点像说,“忽略输入参数,然后使用它。”
  1 import java.io._
  2 
  3 object WithPrintWriter1 {
  4   def withPrintWriter(file: File, op: PrintWriter => Unit) {
  5     val writer = new PrintWriter(file)
  6     try {
  7       op(writer)
  8     } finally {
  9       writer.close()
 10     }
 11   }
 12   def main(args: Array[String]) {
 13     withPrintWriter(
 14       new File("date.txt"),
 15       (a: PrintWriter) => a.println(new java.util.Date)
 16     )
 17   }
 18 }
a => a.println(new java.util.Date)
a: PrintWriter => a.println(new java.util.Date)