加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中,是否可以“定义”def的类型参数?

发布时间:2020-12-16 18:08:49 所属栏目:安全 来源:网络整理
导读:假设我有一个带有多个类型参数的def: def foo [A,B,C](b:B,c:C)(隐式ev:作家[A]) 但是,预期的用法是应该推断出类型参数B和C(基于传入的参数).并且调用者应该只需要明确地指定A(例如,具有由编译器选择的适当隐式).不幸的是,Scala只允许调用者指定所有类型
假设我有一个带有多个类型参数的def:

def foo [A,B,C](b:B,c:C)(隐式ev:作家[A])

但是,预期的用法是应该推断出类型参数B和C(基于传入的参数).并且调用者应该只需要明确地指定A(例如,具有由编译器选择的适当隐式).不幸的是,Scala只允许调用者指定所有类型参数或不允许任何类型参数.从某种意义上说,我希望咖喱的类型参数:

def foo [A] [B,C] ……

在Scala中有一些技巧可以实现吗?

(如果我的具体例子没有完全合理,我很乐意通过建议改进它.)

解决方法

我能够解决这个问题的最好方法是定义一个包含curried类型信息的类,然后使用apply方法模拟函数调用.

我在这里写过这篇文章 – http://caryrobbins.com/dev/scala-type-curry/

对于您的具体示例,您需要将隐式ev:Writes [A]放在apply的签名中,而不是放在foo的签名中.这是因为它在显式传递隐式参数或隐式调用apply方法之间引起歧义.

以下是您的示例的示例实现 –

object Example {
  def foo[A]: _Foo[A] = _foo.asInstanceOf[_Foo[A]]

  final class _Foo[A] private[Example] {
    def apply[B,C](b: B,c: C)(implicit ev: Writes[A]): Unit = ???
  }

  private lazy val _foo = new _Foo[Nothing]
}

然后,您可以提供您希望咖喱的类型参数,并推断传递给apply方法的以下参数.

Example.foo[Int]("bar",new Object)

如果最终需要指定其他类型参数,可以通过显式调用apply来实现;虽然,我从未见过有必要这样做.

Example.foo[Int].apply[String,Object]("bar",new Object)

如果您不想使用中间类型,您也可以使用结构类型,我在上述帖子中讨论过;但是,这需要reflectCalls和推断类型签名,我都希望避免这两种情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读