수색…


비고

스칼라는 메서드와 함수를 구문 적으로 동일하게 취급하기 위해 많은 노력을 기울이고 있습니다. 그러나 두려운면에서, 그들은 뚜렷한 개념입니다.

메소드는 실행 가능한 코드이며 값 표현이 없습니다.

함수는 Function1 유형의 실제 객체 인스턴스 (또는 다른 유형의 유사한 유형)입니다. 그 코드는 그 apply 메소드에 포함되어있다. 효과적으로, 단순히 전달할 수있는 값의 역할을합니다.

덧붙여, 값으로 기능을 처리 할 수있는 능력은 고차 기능에 대한 지원을 갖는 언어로 정확하게 의미하는 무슨. 함수 인스턴스는이 기능을 구현하는 스칼라의 접근 방식입니다.

실제 고차 함수는 함수 값을 인수로 취하거나 함수 값을 반환하는 함수입니다. 하지만 스칼라에서는 모든 연산이 메서드이기 때문에 함수 매개 변수를 받거나 반환하는 메서드를 생각하는 것이 일반적입니다. 따라서 Seq 정의 된 map 은 매개 변수가 함수이기 때문에 "higher-order function"으로 간주 될 수 있지만 말 그대로 함수는 아닙니다. 그것은 방법입니다.

메소드를 함수 값으로 사용

Scala 컴파일러는 메소드를 고차 함수로 전달하기 위해 메소드를 함수 값으로 자동 변환합니다.

object MyObject {
  def mapMethod(input: Int): String = {
    int.toString
  }
}

Seq(1, 2, 3).map(MyObject.mapMethod) // Seq("1", "2", "3")

위의 예에서 MyObject.mapMethod 는 함수 호출이 아니라 값으로 map 전달됩니다. 사실, map 시그니처에서 볼 수 있듯이 전달 된 함수 값을 필요 로합니다. List[A] ( A 유형의 객체 List[A] map 에 대한 서명은 다음과 같습니다.

def map[B](f: (A) ⇒ B): List[B]

f: (A) => B 부분은이 메소드 호출에 대한 매개 변수가 A 유형 A 오브젝트를 취해 B 유형의 오브젝트를 리턴하는 일부 함수임을 나타냅니다. AB 는 임의로 정의됩니다. 첫 번째 예제로 돌아가서 mapMethodInt ( A 해당)를 취해 String ( B 해당)을 반환한다는 것을 알 수 있습니다. 따라서 mapMethodmap 에 전달할 유효한 함수 값입니다. 다음과 같은 코드를 다시 작성할 수 있습니다.

Seq(1, 2, 3).map(x:Int => int.toString)

이렇게하면 함수 값이 인라인되어 간단한 함수를 명확하게 나타낼 수 있습니다.

고차 함수 (매개 변수로서의 기능)

1 차 함수와 반대되는 고차 함수는 세 가지 형식 중 하나를 가질 수 있습니다.

  • 하나 이상의 매개 변수가 하나의 함수이고 어떤 값을 반환합니다.

  • 함수를 반환하지만 매개 변수 중 하나도 함수가 아닙니다.

  • 위의 두 가지 : 하나 이상의 매개 변수는 하나의 함수이며 하나의 함수를 반환합니다.

    object HOF {
        def main(args: Array[String]) {
        val list = List(("Srini","E"),("Subash","R"),("Ranjith","RK"),("Vicky","s"),("Sudhar","s"))
        //HOF
         val fullNameList= list.map(n => getFullName(n._1, n._2))
    
         }
    
        def getFullName(firstName: String, lastName: String): String = firstName + "." + lastName
        }
    

여기서 map 함수는 getFullName(n._1,n._2) 함수를 매개 변수로 사용합니다. 이를 HOF (Higher order function)라고합니다.

인수 지연 평가

Scala는 notation : def func(arg: => String) 사용하여 함수 인자에 대한 lazy evaluation을 지원합니다. 이러한 함수 인수는 일반 String 객체 또는 String 반환 유형이있는 더 높은 차수의 함수를 사용할 수 있습니다. 두 번째 경우, 함수 인수는 값 액세스시 평가됩니다.

예제를 참조하십시오.

def calculateData: String = {
  print("Calculating expensive data! ")
  "some expensive data"
}

def dumbMediator(preconditions: Boolean, data: String): Option[String] = {
  print("Applying mediator")
  preconditions match {
    case true => Some(data)
    case false => None
  }
}

def smartMediator(preconditions: Boolean, data: => String): Option[String] = {
  print("Applying mediator")
  preconditions match {
    case true => Some(data)
    case false => None
  }
}

smartMediator(preconditions = false, calculateData)

dumbMediator(preconditions = false, calculateData)

smartMediator 호출은 None 값을 반환하고 "Applying mediator" 메시지를 출력합니다.

dumbMediator 호출은 None 값을 반환하고 "Calculating expensive data! Applying mediator""Calculating expensive data! Applying mediator" 입니다. "Calculating expensive data! Applying mediator" 메시지를 출력합니다.

게으른 평가는 값 비싼 인수 계산의 오버 헤드를 최적화하려는 경우 매우 유용 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow