gpt4 book ai didi

scala - 更高种类的隐式参数解析

转载 作者:行者123 更新时间:2023-12-03 16:08:58 24 4
gpt4 key购买 nike

考虑以下代码:

object foo {

trait Bar[Q[_]]

implicit object OptionBar extends Bar[Option]

def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) = ()

def main(args: Array[String]) {
test(Some(42): Option[Int]) //???
}
}

这可行,但是我需要将Some(42)键入Option [Int],否则隐式对象OptionBar将无法解析(因为预计会使用Bar [Some])。有没有一种方法可以避免进行显式键入,以便即使我使用Some或None进行测试,也可以在测试中获得隐式OptionBar对象?

[说明]
  • 我在这里使用Option作为示例,如果我有抽象类的Bar等,它也应该工作。
  • 如果其他不相关的条形图在范围内,则该解决方案也应起作用,例如implicit object listBar extends Bar[list]

  • [更新]

    似乎使Bar的参数成为协变量可以达到目的:
    object foo {

    trait Bar[-Q[_]] //<---------------

    implicit object OptionBar extends Bar[Option]
    implicit object ListBar extends Bar[List]

    def test[T, C[_]](c: C[T])(implicit bar: Bar[C]) = ()

    def main(args:Array[String]) {
    test(Some(42))
    }
    }

    但是,这当然是对Bar可能性的严重限制,因此我仍然希望有一个更好的答案。

    最佳答案

    它并非在所有情况下都有效,但是如上所述,您可以尝试以下操作:

    object foo {
    trait Bar[Q[_]]

    implicit object OptionBar extends Bar[Option]

    def test[T, C[_], D](c: D)(implicit bar: Bar[C], ev: D <:< C[T]) = ()

    def main(args: Array[String]) {
    test(Some(42)) //???
    }
    }

    有趣的是,尽管它表达了相同的内容,但这并不能推断:
    def test[T, C[_], D <: C[T]](c: D)(implicit bar: Bar[C]) = ()

    要了解有关 <:<的更多信息,请参见:
  • What do <:<, <%<, and =:= mean in Scala 2.8, and where are they documented?
  • <:< operator in scala
  • 关于scala - 更高种类的隐式参数解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816251/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com