복붙노트

[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. ==============================

    1.주된 이유는 스칼라 유형 시스템은 힌들리-Milner의 타입 추론 알고리즘을 지원하지 않는 하위 입력을 허용한다는 것이다.

    주된 이유는 스칼라 유형 시스템은 힌들리-Milner의 타입 추론 알고리즘을 지원하지 않는 하위 입력을 허용한다는 것이다.

    알고리즘은 훨씬 더가 작동 있도록 GHC 원인 형식 유추가 지원하는 많은 대중적인 유형의 시스템 확장이 일부 표현에 대한 명시 적 유형의 서명을 제공하기 위해 강제로 다시 실패 할 수 있지만, 하스켈, 하위 입력이 없습니다.

    결국,이 타입 시스템의 전력 및 수행 할 수 있습니다 형식 유추의 양 사이의 트레이드 오프입니다. 스칼라와 하스켈은 단순히 서로 다른 장단점을 만들었습니다.

  2. ==============================

    2.나는 주된 이유가 이미 부여 된 것 같아요,하지만 난 특히 정보로 스칼라의 제작자 마틴 오더 스키에 의해이 견적을 찾을 수

    나는 주된 이유가 이미 부여 된 것 같아요,하지만 난 특히 정보로 스칼라의 제작자 마틴 오더 스키에 의해이 견적을 찾을 수

    출처 : 포스트 유니버셜 타입 추론에서 코멘트는 나쁜 것입니다.

  3. ==============================

    3.HAMMAR 가장 큰 이유를했다. 여기에 다른 두 사람은 다음과 같습니다 :

    HAMMAR 가장 큰 이유를했다. 여기에 다른 두 사람은 다음과 같습니다 :

    치다

    def foo(x) = x.a + x.b
    

    어떻게 스칼라 가능성이 인수의 유형을 추론 할 수 있을까? 그것은 a와 b 필드 모든 클래스를 찾을해야 하는가? 더 1보다 무엇이 있는지? 에서 하스켈

    foo x = (a x) + (b x)
    

    기록 이름은 자신의 문제를 제시하지만 수단은 항상 어떤 기록이 언급되는 내용 추론 할 수있는 고유합니다.

    스칼라에서 일치되는 객체의 유형은 경기의 일부로서 사용할 수있다, 또는 일치가 수행해야합니다 방법을 결정. 경우에 모든 생성자 목록위한 그래서 경우에도, 당신은 그것에 목록 이외의 무언가를 전달하려면, 그것은 실패 할 수도 있습니다.

  4. ==============================

    4.힌들리 - 밀너의 형식 유추 잘 재생되지 않는 또 다른 것은 기본 인수 등의 방법 오버로드 및 관련 기능과 변수 인수. 즉, (스칼라에서 사소한) 하스켈 zipWithN 같은 쓰기 것들에 너무 어려운 이유입니다.

    힌들리 - 밀너의 형식 유추 잘 재생되지 않는 또 다른 것은 기본 인수 등의 방법 오버로드 및 관련 기능과 변수 인수. 즉, (스칼라에서 사소한) 하스켈 zipWithN 같은 쓰기 것들에 너무 어려운 이유입니다.

  5. from https://stackoverflow.com/questions/7234095/why-is-scalas-type-inference-not-as-powerful-as-haskells by cc-by-sa and MIT license