복붙노트

[SCALA] 스칼라에서 일부 기능을 사용하여 - 그것은 어떻게 작동합니까?

SCALA

스칼라에서 일부 기능을 사용하여 - 그것은 어떻게 작동합니까?

나는 내가 2.9.1를 사용하고, 나는 부분 함수를 사용하는 방법을 내 머리를 해결하기 위해 노력하고있어 스칼라에 새로운 해요. 나는 카레 기능에 대한 기본적인 이해를 가지고 있고, 나는 부분적인 기능 종류 그들은 단지 2nary 또는 일부 등이다 카레 기능 등이다 것을 알고있다. 당신이 말할 수 나는이에 약간 녹색을 해요.

내가 더 나은 사용 방법의 이해를 얻을 수 바라고 있어요 그래서 XML 필터링 같은 특정 경우에, 부분적인 기능을 할 수있는 것은, 매우 유리하다고 보인다.

나는 RewriteRule의 구조를 사용하는 기능을 가지고 있지만 RewriteRule의 구조는 단 하나, 또는 부분적인 기능을한다 반면에 나는 두 개의 인수 작업에 필요합니다. 나는 이것이 내가 도움이되는 생각 해요 사례 중 하나라고 생각합니다.

어떤 조언, 링크, 지혜 등 환영의 말!

대답은 지금까지 우수하고, 내가 가진 몇 가지 근본적인 오해를 정리했다. 나는 사투를 벌인거야 어디도 설명 할 생각 - 나도 그렇게 할 것이다 그래서 어쩌면, 좀 더 구체적인 뜻에 도움이되는 새로운 질문을 게시 생각합니다.

해결법

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

    1.부분적인 기능은 당신이 그것을에 전달할 수있는 해당 유형의 값의 하위 집합에 유효한 기능입니다. 예를 들면 :

    부분적인 기능은 당신이 그것을에 전달할 수있는 해당 유형의 값의 하위 집합에 유효한 기능입니다. 예를 들면 :

    val root: PartialFunction[Double,Double] = {
      case d if (d >= 0) => math.sqrt(d)
    }
    
    scala> root.isDefinedAt(-1)
    res0: Boolean = false
    
    scala> root(3)
    res1: Double = 1.7320508075688772
    

    당신이 함수가 정의 여부를 확인하는 방법을 알고 뭔가를 할 때 유용합니다. 예를 들어, 수집 :

    scala> List(0.5, -0.2, 4).collect(root)   // List of _only roots which are defined_
    res2: List[Double] = List(0.7071067811865476, 2.0)
    

    이것은 당신이 당신이 정말로 하나를 원하는 두 개의 인수를 배치 도움이 될 수 없습니다.

    대조적으로, 일부 적용 함수는 인수의 일부가 이미 충전 된 함수이다.

    def add(i: Int, j: Int) = i + j
    val add5 = add(_: Int,5)
    

    지금 당신은 하나 개의 인수가 필요합니다 - 물건이 5를 추가 할 - 대신 두의 :

    scala> add5(2)
    res3: Int = 7
    

    당신은 그것을 사용하는 방법이 예에서 볼 수 있습니다.

    당신이 그 두 개의 인수를 지정해야하지만, 이것은 아직하지 않을 것이다 - 당신은 예를 들어, 맵을 사용하고 싶은 말은, 당신은 그것을 하나 개의 인자의 기능을 제공해야하지만 당신은 다른 두 가지를 추가 할 . 그럼 당신은 할 수

    val addTupled = (add _).tupled
    

    부분적으로 기능을 적용 할 (아무것도 채워되지 않았기 때문에 정말, 그냥 방법에서 함수를 만드는) 다음 튜플에 별도의 인수를 결합합니다. 이제 (유형이 올바른지 가정) 하나의 인자를 필요로 장소에서 이것을 사용할 수 있습니다 :

    scala> List((1,2), (4,5), (3,8)).map(addTupled)
    res4: List[Int] = List(3, 9, 11)
    

    대조적으로, 태닝 다시금 다르다; 그것은 (A, B) 형태의 기능을 온 => C에 A => B => 다중 인자들의 함수 주어가 각각 인출 한 인수 그 함수의 체인을 생성하고 체인을 반환이다 C. 짧은 (당신은 부분적으로 한 번에 하나 개의 인수를 적용하기로 생각할 수 있습니다.)

    val addCurried = (add _).curried
    
    scala> List(1,4,3).map(addCurried)
    res5: List[Int => Int] = List(<function1>, <function1>, <function1>)
    
    scala> res5.head(2)   // is the first function, should add 1
    res6: Int = 3
    
    scala> res5.tail.head(5)   // Second function should add 4
    res7: Int = 9
    
    scala> res5.last(8)  // Third function should add 3
    res8: Int = 11
    
  2. ==============================

    2.그리고 하나 놀라운 일이이 - 렉스 커의 설명이 매우 좋다. 문제는 명확하게 부분적으로 적용 기능을 가진 일부 기능을 혼합한다. 무엇을 위해 내가 스칼라을 알았을 때 나는 같은 혼란에게 자신을 만들어 가치가있다.

    그리고 하나 놀라운 일이이 - 렉스 커의 설명이 매우 좋다. 문제는 명확하게 부분적으로 적용 기능을 가진 일부 기능을 혼합한다. 무엇을 위해 내가 스칼라을 알았을 때 나는 같은 혼란에게 자신을 만들어 가치가있다.

    문제는 부분적인 기능에 주목하지 때문에, 나는 그들에게 조금 말을하고 싶습니다.

    많은 사람들은 일부 기능은 모든 입력에 대해 정의되지 않은 함수는 말, 그것은하지만 스칼라의, 수학의 사실이다. 스칼라 함수 중 하나는 모든 입력에 대해 정의 될 수있다. 사실, 기능에서 일부 기능을 상속하기 때문에, 다음 기능은 피할 수 있음을 만들기뿐만 아니라 모든 부분의 기능이 포함되어 있습니다.

    다른 사람은 실제로있는 방법 isDefinedAt, 차이,하지만 대부분 구현에 대한 하나를 언급. 즉 스칼라 2.10 아마 isDefinedAt에 의존하지 않는 "빠른 부분 기능"에 발표 될 예정 너무 사실입니다.

    진실에서 멀리 수 없습니다 - 그리고 몇 사람이 심지어는 일부 기능에 대한 방법을 적용 함수에 대한 방법을 적용보다에만 정의 된 입력을 실행처럼, 뭔가 다른 할 것을 의미한다. 는 방법은 완전히 동일 적용됩니다.

    어떤 부분의 기능이 정말 내려와 또 다른 방법입니다 : OrElse라는. 그 부분 함수는 다음 중 하나를 수행 대해 정말 때문에 훨씬 더 isDefinedAt보다는 부분적인 기능에 대한 모든 사용 사례 요약한다 :

    내가 당신을 마음, 모든 것을 쉽게 OrElse라는 측면에서 구현 될 수 말하는 게 아니에요. 난 그냥 일부 기능은 입력에 대해 정의되지 않은 경우 뭔가 다른 일에 대한 것을 말하고있다.

  3. from https://stackoverflow.com/questions/8650549/using-partial-functions-in-scala-how-does-it-work by cc-by-sa and MIT license