스칼라는 왜 명시적인 반환 유형을 갖는 함수를 요구합니까?


11

나는 최근 스칼라에서 프로그램을 배우기 시작했고 지금까지 재미있었습니다. 나는 직관적 인 일을하는 것처럼 보이는 다른 함수 내에서 함수를 선언하는 기능을 정말로 좋아합니다.

내가 스칼라에 대해 가지고있는 한 가지 애완 동물은 스칼라가 함수에 명시적인 리턴 타입을 요구 한다는 사실입니다 . 그리고 나는 이것이 언어의 표현력을 방해한다고 생각합니다. 또한 해당 요구 사항으로 프로그래밍하기가 어렵습니다. 어쩌면 내가 자바 스크립트와 루비 컴포트 존에서 왔기 때문일 수 있습니다. 그러나 응용 프로그램에 수많은 연결된 함수가있는 스칼라와 같은 언어의 경우, 내가 작성하고있는 특정 함수가 재귀 후 재귀와 함께 반환 해야하는 유형을 정확히 머리에 브레인 스토밍하는 방법을 알 수 없습니다.

함수에 대한 명시적인 반환 유형 선언 요구 사항은 Java 및 C ++과 같은 언어에 영향을 미치지 않습니다. Java 및 C ++의 재귀는 발생했을 때 최대 2 ~ 3 개의 함수로 처리되었습니다. 스칼라처럼 여러 기능을 함께 연결하지 마십시오.

스칼라가 명시적인 반환 유형을 가진 함수를 요구해야하는 이유가 있는지 궁금합니다.


5
그것은 아닙니다. 그리고 그것이 왜 문제가되는지 왜 알지 못합니다.
Keith Thompson

1
나는 그렇게 생각했다. 스칼라에서 함수의 반환 유형이 실제로 모호한 경우가 있습니까?
가비지 수집

답변:


15

스칼라는 모든 함수 에 대해 명시적인 리턴 유형을 요구하지 않고 재귀 함수 만 필요합니다. 그 이유는 스칼라의 형식 유추 알고리즘이 처음부터 끝까지 간단한 스캔이기 때문에 미리 볼 수 없기 때문입니다.

이것은 다음과 같은 기능을 의미합니다.

def fortuneCookieJoke(message: String) = message + " in bed."

Scala 컴파일러는 논리 변수를 사용하거나 메소드의 매개 변수 이외의 것을 보지 않고 리턴 유형이 반드시 있어야한다는 것을 알기 때문에 리턴 유형이 필요하지 않습니다 String.

반면에 다음과 같은 기능이 있습니다.

def mapInts(f: (Int) => Int, l: List[Int]) = l match {
  case Nil => Nil
  case x :: xs => f(x) :: mapInts(f, xs)
}

스칼라 컴파일러는 lookahead 또는 논리 변수를 사용하지 않고 정확히 유형이 무엇인지 볼 수 없으므로 컴파일 타임 오류가 발생합니다 mapInts. 충분히 똑똑하다면, 리턴 타입은의 타입 List[Nothing]이기 때문에 리턴 타입은의 슈퍼 타입 Nil이라는 것입니다. 따라서의 반환 유형을 정확하게 결정하기에 충분한 정보가 근처에 없습니다 mapInts.

이것은 스칼라에만 해당되며 훨씬 더 포괄적이고 유능한 유형 유추 알고리즘을 사용하는 다른 정적으로 유형이 지정된 언어 (대부분의 Miranda / Haskell / Clean 계열, 대부분의 ML 계열 및 기타 흩어져있는 기타)가 있습니다. 스칼라가 사용하는 것보다 또한 이것은 전적으로 스칼라의 잘못이 아니라는 점에 유의하십시오. 공칭 서브 타이핑과 전체 모듈 타입 추론은 근본적으로 서로 상충되며, 스칼라의 설계자들은 자바 호환성을 위해 후자를 선호한다. "순수한"정적 타입의 기능적 언어는 대부분 마음에 반대되는 선택.


4
실제로, 문제는 더 포괄적 인 형식 추론 알고리즘을 파악하는 데 그다지 중요하지 않습니다. 현재 Scala 컴파일러의 고품질 오류 메시지를 유지하면서 보다 포괄적 인 형식 추론 알고리즘을 파악하고 있습니다.
Jörg W Mittag 5

1
에 대한 올바른 반환은 case Nil실제로 비어 있지 List[Int]()않습니까? 이 경우 충분히 똑똑한 컴파일러가 알아낼 수 있습니다. 그래도 Devil 's Advocate를 플레이하고 있다고 생각합니다.
KChaloux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.