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))()
동기 중 하나가 암시 적 매개 변수 목록이라는 것을 알고 있습니다. "암시 적"은 매개 변수가 아니라 목록의 속성입니다. 다른 하나는 아마도 케이스 클래스 일 것입니다. 첫 번째 매개 변수 목록 만 케이스 필드가됩니다.
'Nice programing' 카테고리의 다른 글
경로와 함께 "시작"을 사용하고 공백이있는 명령을 사용하여 Windows에서 배치 파일을 만드는 방법 (0) | 2020.10.11 |
---|---|
Rails에서 데이터베이스를 시드하는 가장 좋은 방법은 무엇입니까? (0) | 2020.10.11 |
힘내 : "변경되었지만 커밋되지 않은"상태에서 완고하게 멈춘 파일 2 개를 되 돌리는 방법은 무엇입니까? (0) | 2020.10.11 |
일식에서 줄 번호의 왼쪽에있는 노란색 가로 화살표는 무엇을합니까? (0) | 2020.10.11 |
mongodb-native findOne ()에서 변수를 필드 이름으로 사용하는 방법은 무엇입니까? (0) | 2020.10.11 |