[SCALA] 왜 스칼라의 형식 유추는 하스켈의로하지 강력한?
SCALA왜 스칼라의 형식 유추는 하스켈의로하지 강력한?
하스켈의 타입 추론 엔진은 훨씬 더 강력 스칼라의보다. 하스켈 I에서 거의 명시 적 유형은 메소드 정의에 표현식에서 유추가 아니라 할 수있다 스칼라 반면 유형을 쓸 필요가 없습니다.
예를 들어, 하스켈 코드 다음을 참조 :
size xs = loop xs 0
where
loop [] acc = acc
loop (_ : xs) acc = loop xs (acc+1)
이 목록의 크기를 반환합니다. 하스켈 컴파일러는 어떤 종류가 사용되는 어떤 함수 정의가를 인식 할 수 있습니다. 등가 스칼라 코드 :
def size[A]: List[A] => Int = xs => {
def loop: (List[A], Int) => Int = {
case (Nil, acc) => acc
case (_ :: xs, acc) => loop(xs, acc+1)
}
loop(xs, 0)
}
또는 메소드 정의와 :
def size[A](xs: List[A]) = {
def loop(xs: List[A], acc: Int): Int = xs match {
case Nil => acc
case _ :: xs => loop(xs, acc+1)
}
loop(xs, 0)
}
내 질문은 : 왜 다음처럼 쓸 수 없습니다?
def size = xs => {
def loop = {
case (Nil, acc) => acc
case (_ :: xs, acc) => loop(xs, acc+1)
}
loop(xs, 0)
}
메소드 정의 다시 한 번 :
def size(xs) = {
def loop(xs, acc) = xs match {
case Nil => acc
case _ :: xs => loop(xs, acc+1)
}
loop(xs, 0)
}
아무도 아직 구현되지 않았기 때문에 그것은인가? 이 경우 필요에 따라 스칼라의 타입 시스템은 강력한으로 아닌가? 또는이 다른 이유는 무엇입니까?
해결법
-
==============================
1.주된 이유는 스칼라 유형 시스템은 힌들리-Milner의 타입 추론 알고리즘을 지원하지 않는 하위 입력을 허용한다는 것이다.
주된 이유는 스칼라 유형 시스템은 힌들리-Milner의 타입 추론 알고리즘을 지원하지 않는 하위 입력을 허용한다는 것이다.
알고리즘은 훨씬 더가 작동 있도록 GHC 원인 형식 유추가 지원하는 많은 대중적인 유형의 시스템 확장이 일부 표현에 대한 명시 적 유형의 서명을 제공하기 위해 강제로 다시 실패 할 수 있지만, 하스켈, 하위 입력이 없습니다.
결국,이 타입 시스템의 전력 및 수행 할 수 있습니다 형식 유추의 양 사이의 트레이드 오프입니다. 스칼라와 하스켈은 단순히 서로 다른 장단점을 만들었습니다.
-
==============================
2.나는 주된 이유가 이미 부여 된 것 같아요,하지만 난 특히 정보로 스칼라의 제작자 마틴 오더 스키에 의해이 견적을 찾을 수
나는 주된 이유가 이미 부여 된 것 같아요,하지만 난 특히 정보로 스칼라의 제작자 마틴 오더 스키에 의해이 견적을 찾을 수
출처 : 포스트 유니버셜 타입 추론에서 코멘트는 나쁜 것입니다.
-
==============================
3.HAMMAR 가장 큰 이유를했다. 여기에 다른 두 사람은 다음과 같습니다 :
HAMMAR 가장 큰 이유를했다. 여기에 다른 두 사람은 다음과 같습니다 :
치다
def foo(x) = x.a + x.b
어떻게 스칼라 가능성이 인수의 유형을 추론 할 수 있을까? 그것은 a와 b 필드 모든 클래스를 찾을해야 하는가? 더 1보다 무엇이 있는지? 에서 하스켈
foo x = (a x) + (b x)
기록 이름은 자신의 문제를 제시하지만 수단은 항상 어떤 기록이 언급되는 내용 추론 할 수있는 고유합니다.
스칼라에서 일치되는 객체의 유형은 경기의 일부로서 사용할 수있다, 또는 일치가 수행해야합니다 방법을 결정. 경우에 모든 생성자 목록위한 그래서 경우에도, 당신은 그것에 목록 이외의 무언가를 전달하려면, 그것은 실패 할 수도 있습니다.
-
==============================
4.힌들리 - 밀너의 형식 유추 잘 재생되지 않는 또 다른 것은 기본 인수 등의 방법 오버로드 및 관련 기능과 변수 인수. 즉, (스칼라에서 사소한) 하스켈 zipWithN 같은 쓰기 것들에 너무 어려운 이유입니다.
힌들리 - 밀너의 형식 유추 잘 재생되지 않는 또 다른 것은 기본 인수 등의 방법 오버로드 및 관련 기능과 변수 인수. 즉, (스칼라에서 사소한) 하스켈 zipWithN 같은 쓰기 것들에 너무 어려운 이유입니다.
from https://stackoverflow.com/questions/7234095/why-is-scalas-type-inference-not-as-powerful-as-haskells by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 개인 및 스칼라에서 생성자를 보호 (0) | 2019.11.25 |
---|---|
[SCALA] Akka 스트림에서 배우의 흐름을 만들기 (0) | 2019.11.25 |
[SCALA] 스칼라에서 두 dataframes의 스키마 비교 (0) | 2019.11.25 |
[SCALA] C #의 확장 방법의 스칼라 동등한? (0) | 2019.11.25 |
[SCALA] 어떻게 스칼라에서 배열을 정렬합니까? (0) | 2019.11.25 |