복붙노트

[SCALA] 왜 스칼라 목록 당 모두 여러 매개 변수 목록과 여러 매개 변수를 제공합니까? [복제]

SCALA

왜 스칼라 목록 당 모두 여러 매개 변수 목록과 여러 매개 변수를 제공합니까? [복제]

여러 매개 변수 목록, 예를 들어, DEF foo는 (a : INT) (B : INT) = {} 및 목록 당 여러 개의 파라미터, 예를 들어 데프 foo는 (A : INT, B : INT) = {}이다 동일한 의미를 지금까지 내가 말할 수있는, 가장 기능적인 언어가 여러 매개 변수를 선언하는 단 하나 개의 방법이, 예를 들어, 에프#.

내가 함수 정의의 모두에게 이러한 스타일을 지원하기위한 알아낼 수있는 유일한 이유는 단지 하나의 매개 변수가 매개 변수 목록을 사용하여 언어 확장 구문처럼 수 있도록하는 것입니다.

def withBufferedWriter(file: File)(block: BufferedWriter => Unit)

지금 호출 할 수있는 구문을 찾고

withBufferedWriter(new File("myfile.txt")) { out =>
  out write "whatever"
  ...
}

그러나 여러 매개 변수 목록을하지 않고 중괄호의 사용을 지원하는 다른 방법이있을 수 있습니다.

이와 관련된 질문 : 왜 스칼라에서 여러 매개 변수 목록의 사용은 "무두질"이라고? 커링 보통 일부 애플리케이션 지원을 위해서하는 n 차 함수 단항 제조하는 기술로서 정의된다. 그러나, 하나의 스칼라 함수 부분적 버전 (각각 하나 PARAM 여러 파라미터리스트)는 "카레"을하지 않고 기능을 적용 할 수있다.

해결법

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

    1.그것은 예컨대을 할 당신이 할 수 있습니다 :

    그것은 예컨대을 할 당신이 할 수 있습니다 :

    scala> def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum
    foo: (as: Int*)(bs: Int*)(cs: Int*)Int
    
    scala> foo(1, 2, 3)(4, 5, 6, 7, 9)(10, 11)
    res7: Int = 3906
    
  2. ==============================

    2.뿐만 아니라 당신이 방법을 쓸 수 같은 것을 (이미 발견) 언어의 일부처럼, 타입 inferencer 한 번에 하나 개의 블록으로 작동 할 것이라고 지적 그것의 가치.

    뿐만 아니라 당신이 방법을 쓸 수 같은 것을 (이미 발견) 언어의 일부처럼, 타입 inferencer 한 번에 하나 개의 블록으로 작동 할 것이라고 지적 그것의 가치.

    이 너무 :

    def foo[T](a: T, b: T)(op: (T,T)=>T) = op(a,b)
    foo(1,2){_+_}
    

    T는 먼저 폐쇄의 두 밑줄 형태로 사용될 INT,로 추정된다. 이 컴파일러는 다음 + 작업이 유효한지, 완전한 형태의 안전을 알고하는 방법입니다.

  3. ==============================

    3.당신의 대답하기 위해 "관련 질문에,"태닝은 단순히 예를 들어, 여러 인수의 기능을 전환하는 방법입니다 (A, B, C) => D, 하나 개의 인수 및 반환하는 함수를 취하는 함수에, 예를 들어, A => (B => (C => D)) (괄호 도시하지만 필요 없음).

    당신의 대답하기 위해 "관련 질문에,"태닝은 단순히 예를 들어, 여러 인수의 기능을 전환하는 방법입니다 (A, B, C) => D, 하나 개의 인수 및 반환하는 함수를 취하는 함수에, 예를 들어, A => (B => (C => D)) (괄호 도시하지만 필요 없음).

    튜플화된 형태와 카레 형태는 동형이며, 우리는 그들 사이에 자유롭게 변환 할 수 있습니다. 이러한 프로그램은 모두 동일하지만 서로 다른 구문 의미를 가지고 :

    (A, B, C, D, E) => F
    ((A, B), (C, D, E)) => F
    (A, B) => (C, D, E) => F
    

    별도의 매개 변수 그룹을 선언 할 때, 이것은 당신이하고있는 무두질의 종류입니다. 다중 매개 변수 그룹 방법은 함수를 반환하는 방법은 ... 당신이 REPL에서 볼 수있다 :

    scala> def foo(a:Int, b:Int)(c:Int, d:Int, e:Int):Int = 9
    foo: (a: Int,b: Int)(c: Int,d: Int,e: Int)Int
    
    scala> foo _                                             
    res4: (Int, Int) => (Int, Int, Int) => Int = <function2>
    
  4. ==============================

    4.기본 인수에 돌아 가기 참조 :

    기본 인수에 돌아 가기 참조 :

    case class Foo(bar: Int)
    
    def test(f: Foo)(i: Int = f.bar) = i*i
    
    test(Foo(3))()
    
  5. ==============================

    5.나는 동기 중 하나가 암시 적 매개 변수 목록이었다 알고있다. "암시"목록의 속성이 아닌 매개 변수입니다. 또 다른 아마도 경우 클래스했다 : 첫 번째 매개 변수 목록이 될 경우 필드.

    나는 동기 중 하나가 암시 적 매개 변수 목록이었다 알고있다. "암시"목록의 속성이 아닌 매개 변수입니다. 또 다른 아마도 경우 클래스했다 : 첫 번째 매개 변수 목록이 될 경우 필드.

  6. from https://stackoverflow.com/questions/4684185/why-does-scala-provide-both-multiple-parameters-lists-and-multiple-parameters-pe by cc-by-sa and MIT license