【问题标题】:Scala automatic type inference in polymorphic functionsScala 多态函数中的自动类型推断
【发布时间】:2017-04-06 04:49:59
【问题描述】:

我怎样才能做到这一点?我手头的任务有点复杂,但归结为:

object Z {
  class B extends Function1[Int, Int] {
    def apply(i: Int): Int = i
  }

  def compose[T <: Function1[X, X], X](fcts: List[T]): Function1[X, X] = {
    fcts.reduce(_ andThen _)
  }

  def test() = {
    val fcts = List.empty[B]

    // Unspecified type parameter X
    val composed: Function1[Int, Int] = compose[B](fcts)
  }
}

我不知道如何定义“compose”函数以便能够接收一些具体的类 B 并自动推断依赖类型 X

【问题讨论】:

    标签: scala


    【解决方案1】:

    Scala 编译器在尝试像您一样推断多级类型参数时表现不佳。相反,删除T &lt;: Function1[X, X] 并只需要一个表示Function1 的参数和返回类型的类型参数会更简单。

    def compose[A](fcts: List[Function1[A, A]]): Function1[A, A] = {
      fcts.reduce(_ andThen _)
    }
    

    XT 类型的一部分时,编译器将更容易简单地推断A,而不是试图弄清楚TX 是什么。

    val a: Int => Int = _ + 10
    val b: Int => Int = _ * 2
    val c: Int => Int = _ - 3
    
    scala> val f = compose(List(a, b, c))
    f: Int => Int = scala.Function1$$Lambda$1187/930987088@531ec2ca
    
    scala> f(2)
    res1: Int = 21
    

    请注意,reduce 将为空函数列表引发异常。

    【讨论】:

    • 当然这是一个解决方案.. 不是我想要的。. 没有其他选项使用 forSome 或其他 scala 技巧?问题是,我的 compose 并没有完全收到 List[B](或 Function1] 的列表).. 它比这复杂一点..
    • @MichelLemay 你也许可以在不同的情况下做一些不同的事情,但在这种情况下,我没有看到解决类型推断缺陷的方法。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2020-10-12
    • 2018-03-03
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多