Scala 및 Haskell Type Systems의 차이점과 유사점은 무엇입니까?
-
07-07-2019 - |
문제
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를 비교했다고 생각하지 않습니다. 차이의 주요 요점은 유형 추론의 정도와 더 높은 순위 유형에 대한 지원입니다. 그러나 차이점에 대한 완전한 처리는 출판 가능한 결과 일 것입니다.