【问题标题】:Higher-Order Functions with Tuples元组的高阶函数
【发布时间】:2012-11-29 16:10:16
【问题描述】:

我有以下问题。我试图制作一个接受两个参数的高阶函数:字符串和函数类型。函数类型是这样定义的:

(String, List[String]) => List[(String, List[String])]

我还定义了两个具有相同类型的函数f1f2。之后我尝试用f1f2 打电话给myfun。代码如下:

object Main extends App {


def f1(t: (String,List[String])): List[(String,List[String])] = ...

def f2(t: (String,List[String])): List[(String,List[String])] =  ...

def myfun(tableName: String)(fn: (String,List[String]) => List[(String,List[String])]):  List[(String,List[String])] =
 ...

val res: List[(String,List[String])] = myfun("...")(f1)
res foreach println
val res2: List[(String,List[String])] = myfun("...")(f2)
res2 foreach println
}

这是错误:

[error]  found   : (String, List[String]) => List[(String, List[String])]
[error]  required: (String, List[String]) => List[(String, List[String])]
[error]   val res: List[(String,List[String])] =  myfun("...")(f1)

我不明白为什么编译器会抱怨。谁能解释一下?

【问题讨论】:

  • 您使用的是哪个版本的scalac
  • 我使用的是 Scala 2.9.1 是否还有不同的编译器版本?

标签: scala


【解决方案1】:

试试这个。请注意 fn 的参数列表周围的额外括号。

def myfun(tableName: String)
         (fn: ((String,List[String])) => List[(String,List[String])]):  List[(String,List[String])] = ...

不幸的是,需要这组额外的括号来区分

Function1[(String, List[String]), List[(String,List[String])]] 

来自

Function2[String, List[String], List[(String, List[String])]]

【讨论】:

  • 呃,我认为 scalac 的错误消息是一个错误。有问题提交吗?
  • 好点。我什至没有注意到 scalac 输出的文本。我认为每个编写 scala 的人都做过一次且只有一次。
  • @ziggystar 没试过,不过据此修复了≥2.9.1 issues.scala-lang.org/browse/SI-5067
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
相关资源
最近更新 更多