Nice programing

Scala가 여러 매개 변수 목록과 목록 당 여러 매개 변수를 모두 제공하는 이유는 무엇입니까?

nicepro 2020. 10. 11. 11:19
반응형

Scala가 여러 매개 변수 목록과 목록 당 여러 매개 변수를 모두 제공하는 이유는 무엇입니까?


여러 매개 변수 목록, 예를 들어 def foo(a:Int)(b:Int) = {}목록 당 여러 매개 변수, 예를 들어 def foo(a:Int, b:Int) = {}내가 말할 수있는 한 의미 론적으로 동일하며, 대부분의 기능적 언어에는 F #과 같은 여러 매개 변수를 선언하는 한 가지 방법 만 있습니다.

이 두 가지 스타일의 함수 정의를 지원하는 유일한 이유는 하나의 매개 변수 만있는 매개 변수 목록을 사용하여 구문과 유사한 언어 확장을 허용하는 것입니다.

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

이제 구문 모양으로 호출 할 수 있습니다.

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

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

관련 질문 : Scala에서 여러 매개 변수 목록을 "currying"이라고 부르는 이유는 무엇입니까? Currying은 일반적으로 부분 적용을 지원하기 위해 n 항 함수를 단항으로 만드는 기술로 정의됩니다. 그러나 Scala에서는 함수의 "curried"(각각 하나의 매개 변수가있는 여러 매개 변수 목록) 버전을 만들지 않고도 함수를 부분적으로 적용 할 수 있습니다.


예를 들어 다음을 수행 할 수 있습니다.

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

언어의 일부처럼 보이는 (이미 발견 한) 메서드를 작성할 수있을뿐만 아니라 형식 추론자가 한 번에 한 블록 씩 작동한다는 점에 주목할 가치가 있습니다.

그래서 이것에서 :

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

T먼저으로 추론되고 Int클로저에서 두 개의 밑줄 유형으로 사용됩니다. 이것이 컴파일러가 완전한 타입 안전성을 가지고 + 연산이 유효한지 아는 방법입니다.


"관련 질문"에 답하기 위해 커링은 단순히 여러 인수 (A, B, C) => D의 함수를 하나의 인수를 취하고 함수를 반환하는 함수 로 바꾸는 방법입니다 A => (B => (C => D))( : 괄호는 표시되지만 필수는 아님).

tuple-ized 형태와 curried 형태는 동형이며, 우리는 그들 사이에서 자유롭게 번역 할 수 있습니다. 이들 모두는 동일하지만 구문상의 의미가 다릅니다.

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

별도의 매개 변수 그룹을 선언 할 때 이것이 수행하는 종류의 커링입니다. multi-parameter-group 메서드는 함수를 반환하는 메서드입니다 ... 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>

기본 인수의 역 참조 :

case class Foo(bar: Int)

def test(f: Foo)(i: Int = f.bar) = i*i

test(Foo(3))()

동기 중 하나가 암시 적 매개 변수 목록이라는 것을 알고 있습니다. "암시 적"은 매개 변수가 아니라 목록의 속성입니다. 다른 하나는 아마도 케이스 클래스 일 것입니다. 첫 번째 매개 변수 목록 만 케이스 필드가됩니다.

참고 URL : https://stackoverflow.com/questions/4684185/why-does-scala-provide-both-multiple-parameters-lists-and-multiple-parameters-pe

반응형