【问题标题】:Treat scala function with default parameter type as if it did not have default parameters将具有默认参数类型的 scala 函数视为没有默认参数
【发布时间】:2016-02-26 09:02:20
【问题描述】:

免责声明:我是 Scala 新手。

我想传递一个带有默认参数的函数,就好像它的类型没有默认参数一样

import scala.util.hashing.MurmurHash3

type Record = Map[String, String]
type Dataset = Seq[Record]

def dropDuplicates(dataset: Dataset, keyF: Record => Any = recordHash) : Dataset = {
  // keep only distinct records as defined by the key function
  // removed method body for simplicity
  return dataset
}

def recordHash(record: Record, attributes: Option[Seq[String]] = None) : Int = {
  val values : Seq[String] = attributes
    .getOrElse(record.keys.toSeq.sorted)
    .map(attr => record(attr))
    return MurmurHash3.seqHash(values)
}

这是我在编译时遇到的错误:

error: type mismatch;
[ant:scalac]  found   : (Record, Option[Seq[String]]) => Int
[ant:scalac]  required: Record => Any
[ant:scalac]   def dropDuplicates(dataset: Dataset, keyF: Record => Any = recordHash) : Dataset = {

直觉上,当没有提供默认参数attributes 时,我认为recordHash 为类型Record => Int。有没有办法将recordHash 视为Record => Int 类型?

【问题讨论】:

  • 记住 scala 不需要显式的return,函数的最后一条语句将被返回。
  • 是的,Scala 中首选隐式。我没有太多的python经验,所以我不会猜到。

标签: scala types


【解决方案1】:

我无法编译你的代码,因为我错过了一些类型,但是我认为这会起作用。

def dropDuplicates(dataset: Dataset, keyF: Record => Any = recordHash(_)) : Dataset = {
  // keep only distinct records as defined by the key function
}

这是因为recordHash(_) 等价于x => recordHash(x),这样x(函数的输入)就是Record,这是您想要的类型。

【讨论】:

  • 在这种情况下下划线的用途叫什么?您能否简要解释一下这背后的直觉,或者提供一些关于下划线如何实现这一点的文档的链接?
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2014-02-27
相关资源
最近更新 更多