[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.그것은 예컨대을 할 당신이 할 수 있습니다 :
그것은 예컨대을 할 당신이 할 수 있습니다 :
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.뿐만 아니라 당신이 방법을 쓸 수 같은 것을 (이미 발견) 언어의 일부처럼, 타입 inferencer 한 번에 하나 개의 블록으로 작동 할 것이라고 지적 그것의 가치.
뿐만 아니라 당신이 방법을 쓸 수 같은 것을 (이미 발견) 언어의 일부처럼, 타입 inferencer 한 번에 하나 개의 블록으로 작동 할 것이라고 지적 그것의 가치.
이 너무 :
def foo[T](a: T, b: T)(op: (T,T)=>T) = op(a,b) foo(1,2){_+_}
T는 먼저 폐쇄의 두 밑줄 형태로 사용될 INT,로 추정된다. 이 컴파일러는 다음 + 작업이 유효한지, 완전한 형태의 안전을 알고하는 방법입니다.
-
==============================
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.기본 인수에 돌아 가기 참조 :
기본 인수에 돌아 가기 참조 :
case class Foo(bar: Int) def test(f: Foo)(i: Int = f.bar) = i*i test(Foo(3))()
-
==============================
5.나는 동기 중 하나가 암시 적 매개 변수 목록이었다 알고있다. "암시"목록의 속성이 아닌 매개 변수입니다. 또 다른 아마도 경우 클래스했다 : 첫 번째 매개 변수 목록이 될 경우 필드.
나는 동기 중 하나가 암시 적 매개 변수 목록이었다 알고있다. "암시"목록의 속성이 아닌 매개 변수입니다. 또 다른 아마도 경우 클래스했다 : 첫 번째 매개 변수 목록이 될 경우 필드.
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
'SCALA' 카테고리의 다른 글
[SCALA] 스파크 : 불꽃 쉘에서 스파크 파일을 실행하는 방법 (0) | 2019.11.10 |
---|---|
[SCALA] 스칼라 : 하나의 문에서 파일에 쓰기 문자열 (0) | 2019.11.10 |
[SCALA] 스칼라에서 널 / 아무것도 / 장치의 용도 (0) | 2019.11.10 |
[SCALA] 어떻게 스칼라 변수를 캐스팅 하는가? (0) | 2019.11.10 |
[SCALA] 스칼라 : 어떻게 동적 객체와 반사를 사용하여 메서드 Invoke를 인스턴스화합니까? (0) | 2019.11.10 |