【问题标题】:Declare a Function `type` with `implicit` parameters使用 `implicit` 参数声明函数`type`
【发布时间】:2016-02-19 10:22:29
【问题描述】:

是否有可能声明类似的东西

type F = (Int, Boolean)(implicit String) => Unit

在 Scala 中?

【问题讨论】:

  • 对不起,我删除了我的评论,它是“你可以输入 f = (Int, Boolean) => (String) => Unit Anyway”。你说得对,它不适用于隐式,我想这是因为你不应该在你的类型中依赖它们。采用 Int 和 Boolean 的函数是采用 Int 和 Boolean 的函数,而不考虑范围内的隐含。编辑:好的,下面回答,方法不是函数,函数没有隐式

标签: scala implicit


【解决方案1】:

Scala 中的“函数”和“方法”有一个非常重要的区别:

函数是值,不能按名称取参数,不能是多态的,不能是可变参数的,不能重载的,也不能有隐式参数。虽然方法可以拥有这些,但它们不能作为值传递。

函数类型只是标准库中的特征,形式如下:

trait FunctionN[T1, ..., TN, R] {
  def apply(x1: T1, ..., xN: TN): R
}

请注意这些类型中的apply 方法如何没有 具有隐式参数列表。因此,函数永远不会有隐式参数。

所以如果你想传递带有隐式参数的“函数”,你必须创建你自己的 trait:

trait Function2I1[T1, T2, I1, R] {
  def apply(a1: T1, a2: T2)(implicit i1: I1): R
}

type F = Function2I1[Int, Boolean, String, Unit]

现在您可以创建 F 类型的实例(尽管不是使用闪亮的 lambda 语法):

val f = new F {
  override def apply(x: Int, y: Boolean)(implicit z: String): Unit = ???
}
implicit val x = "hi"
f(1, true) // implicitly passes x

如果你想要没有隐式参数的柯里化函数,只需写(Int, Boolean) => String => Unit

如果要将方法转换为函数,请使用 lambda:

class A {
  def f(a: String)(implicit b: String): String = a + b
}
val a = new A
val m = a.f(_) // takes the implicit in this scope

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2021-10-30
    相关资源
    最近更新 更多