문제

Scala의 유형 시스템을 Haskell 전문가에게 설명하는 방법은 무엇입니까? Scala의 장점을 보여주는 예는 무엇입니까?

고급 스칼라 실무자에게 Haskell의 유형 시스템을 설명하는 방법은 무엇입니까? Scala에서 할 수없는 Haskell에서 무엇을 할 수 있습니까?

도움이 되었습니까?

해결책

Haskell 프로그래머에게 Scala :

Scala는 일류 모듈이있는 엄격하고 불순한 언어입니다. 데이터 유형은 미묘한 차이가있는 "클래스"또는 "특성"으로 선언되며 모듈 또는 "개체"는 이러한 유형의 값입니다. Scala는 보편적으로 정량화 된 유형 매개 변수를 취하는 유형 생성자를 지원합니다. 객체/클래스/특성에는 값, 변수 변수 및 함수로 구성된 멤버가 있습니다 (모듈이 암시 적으로 호출되는 변수로 전달되는 "메소드"라고합니다. this). 모듈에는 매개 변수를 가져갈 수있는 유형 멤버가있을 수 있습니다. 유형 멤버는 실존 적으로 정량화되고 유형 매개 변수는 더 높아질 수 있습니다. 유형은 일류 값의 구성원이 될 수 있기 때문에 Scala 경로 의존적 유형.

일류 기능도 모듈입니다. 함수는 이름이 지정된 메소드가있는 모듈입니다 apply. 메소드는 일류가 아니지만 일류 함수로 메소드를 래핑하기 위해 구문이 제공됩니다. 불행히도, 모듈은 모든 유형 매개 변수를 선발해야하므로 부분적으로 적용된 일류 기능은 보편적으로 정량화 될 수 없습니다. 보다 일반적으로, Scala는 1보다 높은 순위 유형에 대한 직접 메커니즘이 완전히 부족하지만, 고등 유형에서 매개 변수화 된 모듈을 활용하여 Rank-N 유형을 시뮬레이션 할 수 있습니다.

Scala를 사용하면 주어진 유형의 암시 적 값을 선언 할 수 있습니다. 여기에는 암시 적 변환을 제공하는 기능 유형이 포함되어 있으므로 유형 확장자가 포함됩니다. 암시 적 변환 외에도 유형 확장은 모듈 간의 하위 유형/슈퍼 타입 관계를 선언 할 수있는 "확장"메커니즘에 의해 제공됩니다. 이 메커니즘은 슈퍼 타입이 데이터 선언의 왼쪽에있는 유형으로 볼 수있는 대수 데이터 유형을 시뮬레이션하고 오른쪽의 값 생성자로서 하위 유형을 시뮬레이션 할 수 있습니다. Scala는 일류 패턴의 가상화 된 패턴 매칭을 사용하여 광범위한 패턴 매칭 기능을 갖추고 있습니다.

Scala는 하위 유형을 지원하며, 이는 유형의 추론을 상당히 제한합니다. 그러나 시간이 지남에 따라 타입 추론이 개선되었습니다. 더 높은 종류의 유형의 추론이 지원됩니다. 그러나 Scala는 의미있는 친절한 시스템이 없으므로 친절한 추론과 친절한 통일이 없습니다. 유형 변수가 도입되면 친절합니다. * 달리 주석을 달지 않는 한. 같은 특정 유형 Any (모든 유형의 슈퍼 타입) 및 Nothing (모든 유형의 하위 유형)는 기술적으로 모든 종류 유형 인수에 적용 할 수는 없습니다.

스칼라 프로그래머에게 Haskell :

Haskell은 순전히 기능적인 언어입니다. 이것은 함수가 부작용이 전혀 없음을 의미합니다. 예를 들어, Haskell 프로그램은 화면에 인쇄되지 않지만 값을 반환하는 함수입니다. IO[_] IO 서브 시스템이 수행하기위한 일련의 동작을 설명하는 데이터 유형.

Scala는 기본적으로 엄격하고 Namportrict 기능 인수에 대한 "이름 별"주석을 제공하는 반면 Haskell은 기본적으로 "By-Need"시맨틱을 사용하여 게으르고 엄격한 인수에 대한 주석을 제공합니다.

Haskell에서의 타입 추론은 Scala보다 완전한 추론보다 완전합니다. 이것은 유형 주석이 거의 필요하지 않다는 것을 의미합니다.

GHC 컴파일러에 대한 최근 확장은 랭크 -N 유형, 타입 패밀리 및 종류 다형성과 같이 스칼라에 동등한 고급 유형 시스템 기능을 허용합니다.

Haskell에서 모듈은 유형과 기능 모음이지만 모듈은 일류 엔티티가 아닙니다. 암시는 유형 클래스에 의해 제공되지만, 이들은 한 번 선언 된 전 세계적으로 범위를 지정하며 스칼라에서와 같이 명시 적으로 전달 될 수 없습니다. 주어진 유형에 대한 유형 클래스의 여러 인스턴스가 newtype 스칼라에서는 비난을 내리기 위해서는 단순히 범위를 범하거나 인스턴스를 명시 적으로 전달함으로써 해결됩니다.

Haskell은 "객체 지향적"이 아니기 때문에 방법/기능 이분법이 없습니다. 모든 함수는 일류이며 모든 기능은 기본적으로 카레입니다 (함수 1, function2 등).

Haskell에는 하위 유형 메커니즘이 없지만 유형 클래스는 하위 클래스 관계를 가질 수 있습니다.

다른 팁

나는 아무도 체계적으로 Haskell (GHC 유형 시스템에 의해 예시 된)과 Scalas를 비교했다고 생각하지 않습니다. 차이의 주요 요점은 유형 추론의 정도와 더 높은 순위 유형에 대한 지원입니다. 그러나 차이점에 대한 완전한 처리는 출판 가능한 결과 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top