【问题标题】:How to use pattern matching with function values in Scala如何在 Scala 中使用模式匹配与函数值
【发布时间】:2021-02-09 21:54:38
【问题描述】:

我在一个对象中初始化了多个具有相同输入和输出类型的函数

object Utils {
  def f1(value: Int): Double = ???
  def f2(value: Int): Double = ???
  def f3(value: Int): Double = ???
}

我有这些函数的高阶值列表:

val x = List(Utils.f1, Utils.f2)

如何使用模式匹配来检查对象中声明的函数的哪些函数包含在 x 中?我想获得类似于以下代码的东西:

x(0) match {
  case Utils.f1 => ...
  case Utils.f2 => ...
}

【问题讨论】:

  • 这在一般意义上是不可能的,函数相等是一个 NP-Hard 问题,但它们可能是微妙的解决方法。但是,需要知道你有哪个函数感觉很奇怪,这似乎是一个 XY 问题,请解释一下你究竟为什么要这样做,问题背后的元问题是什么?
  • 在我的项目中,我有一组对象,其中一个值是高阶函数,该值描述了对象对某些事件发生的行为。基于这个值,我想在 GUI 中以不同的方式表示这些对象。
  • 您可以创建自己的 ADT 来封装这些函数,这样您就可以对其进行模式匹配以确定您拥有的函数。

标签: scala pattern-matching higher-order-functions


【解决方案1】:

你不能匹配函数,它没有有意义的相等性。

【讨论】:

    【解决方案2】:

    如果您制作f1f2f3vals,这将成为可能。请注意,在模式匹配时,将使用引用相等

    object Utils {
      val f1: Int => Double = _ * 10.0
      val f2: Int => Double = _ * 20.0
      val f3: Int => Double = _ * 30.0
    }
    
    val x: Seq[Int => Double] = List(Utils.f1, Utils.f2)
    
    import Utils._
    
    x(0) match {
      case `f1` => println(1)
      case `f2` => println(2)
      case `f3` => println(3)
    }
    

    如果你保留f1f2f3defs 那么

    object Utils {
      def f1(value: Int): Double = value * 10.0
      def f2(value: Int): Double = value * 20.0
      def f3(value: Int): Double = value * 30.0
    }
    
    val x: Seq[Int => Double] = List(Utils.f1, Utils.f2)
      
    val f1: Int => Double = Utils.f1
    val f2: Int => Double = Utils.f2
    val f3: Int => Double = Utils.f3
    
    x(0) match {
      case `f1` => println(1)
      case `f2` => println(2)
      case `f3` => println(3)
    }
    

    产生MatchError

    【讨论】:

    • 如果输入类型是泛型怎么办? def standardFoodEffect[A <: int a set val>
    • @Snorlite 在 Scala 2 中,没有作为一等公民的多态函数。您必须使用包装器 trait Poly { type B; def apply[A](a: A): B } val standardFoodEffect = new Poly { type B = Set[Double]; def apply[A &lt;: Int](a: A) = ??? } 来模拟它们,例如 shapeless.Poly
    • trait Poly[Upper] {type B; def apply[A &lt;: Upper](a: A): B}, val standardFoodEffect = new Poly[Int]...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2021-03-19
    • 2023-03-21
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多