복붙노트

[SCALA] 평등에 대한 스칼라 함수 값을 비교하는 방법

SCALA

평등에 대한 스칼라 함수 값을 비교하는 방법

당신은 어떻게 평등이 개 스칼라 함수 값을 비교할 수 있습니다. 유스 케이스는 내가 목록에 중복 포함 할 수있는 기능의 목록을 가지고 있고 한 번만 각 기능을 수행 할 것입니다.

만약 내가 가지고 있다면:

scala> object A {
     |   def a {}
     | }
defined module A

scala> val f1 = A.a _
f1: () => Unit = <function0>

scala> val f2 = A.a _
f2: () => Unit = <function0>

나도 == 또는 EQ와 기능을 비교하려고하면, 나는 두 경우 모두 거짓 얻을 것이다 :

scala> f1 == f2
res0: Boolean = false

scala> f1 eq f2
res1: Boolean = false

해결법

  1. ==============================

    1.짧은 답변 : 그것은 불가능합니다.

    짧은 답변 : 그것은 불가능합니다.

    긴 대답 : 당신은 보장하지만 그 "동일한"기능이 acutally 같은 개체임을 기능 공장의 어떤 종류를 가질 수있다. 응용 프로그램의 아키텍처에 따라, 그것은 가능하지만하지 않을 수 있습니다.

  2. ==============================

    2.나는 정도 김의 대답에 조금 원하는 함수 값의 제한 비교를 달성하는 방법의 예를 제공합니다.

    나는 정도 김의 대답에 조금 원하는 함수 값의 제한 비교를 달성하는 방법의 예를 제공합니다.

    당신이 당신의 기능을 설명하는 정의의 어떤 종류가있는 경우,이 기술에 대한 평등을 확인하는 것이 가능하다. 예를 들어, 다음과 같은 방법으로 간단한 산술 함수의 클래스 (아닌 OO 클래스)를 정의 할 수 있습니다 :

    sealed trait ArthFun extends (Double => Double)
    case class Mult(x: Double) extends ArthFun {def apply(y: Double) = x * y}
    case class Add(x: Double) extends ArthFun {def apply(y: Double) = x + y}
    

    ArthFun가 그 클래스와 회원들에 의해 정의되는이 설정, 사용하면 경우 클래스에 의해 정의 된대로 단순히 객체 평등에 의해 ArthFun 유형의 값의 평등을 확인할 수 있습니다.

    scala> trait ArthFun extends (Double => Double)
    defined trait ArthFun
    
    scala> case class Mult(y: Double) extends ArthFun { def apply(x: Double) = x * y; override def toString = "*" + y}
    defined class Mult
    
    scala> case class Add(y: Double) extends ArthFun { def apply(x: Double) = x + y; override def toString = "+" + y }
    defined class Add
    
    scala> Seq(Mult(5),Mult(4),Add(4),Add(3),Mult(5)).distinct
    res4: Seq[Product with ArthFun with Serializable] = List(*5.0, *4.0, +4.0, +3.0)
    
  3. from https://stackoverflow.com/questions/12725257/how-to-compare-scala-function-values-for-equality by cc-by-sa and MIT license