Scala 및 Haskell 유형 시스템의 차이점과 유사점은 무엇입니까?
Scala의 유형 시스템을 Haskell 전문가에게 설명하는 방법은 무엇입니까? Scala의 장점을 보여주는 예는 무엇입니까?
하스켈의 유형 시스템을 고급 스칼라 실무자에게 설명하는 방법은 무엇입니까? Scala에서 할 수없는 Haskell에서는 무엇을 할 수 있습니까?
Haskell 프로그래머에게 Scala :
Scala는 일류 모듈을 사용하는 엄격하고 불순한 언어입니다. 데이터 유형은 미묘한 차이가있는 "클래스"또는 "특성"으로 선언되며 모듈 또는 "객체"는 이러한 유형의 값입니다. Scala는 보편적으로 수량화 된 유형 매개 변수를 사용하는 유형 생성자를 지원합니다. 객체 / 클래스 / 특성은 값, 변경 가능한 변수 및 함수 (모듈이라는 변수로 암시 적으로 전달되는 "메서드"라고 함)로 구성된 멤버를가 this
집니다. 모듈에는 매개 변수를 취할 수도있는 유형 멤버가있을 수 있습니다. 형식 멤버는 실존 적으로 수량화되며 형식 매개 변수는 더 높은 종류가 될 수 있습니다. 유형은 일급 값의 멤버가 될 수 있기 때문에 Scala는 경로 종속 유형 이라는 종속 유형을 제공 합니다.
일류 함수도 모듈입니다. 함수는라는 메서드가있는 모듈입니다 apply
. 메서드는 일류가 아니지만 일류 함수로 메서드를 래핑하기위한 구문이 제공됩니다. 안타깝게도 모듈에는 모든 유형 매개 변수가 선행되어야하므로 부분적으로 적용된 일급 함수는 보편적으로 정량화 할 수 없습니다. 보다 일반적으로 Scala는 1보다 높은 등급 유형에 대한 직접적인 메커니즘이 완전히 결여되어 있지만 더 높은 등급 유형에 매개 변수화 된 모듈을 이용하여 등급 n 유형을 시뮬레이션 할 수 있습니다.
전역 범위가있는 유형 클래스 대신 Scala를 사용하면 지정된 유형의 암시 적 값을 선언 할 수 있습니다. 여기에는 암시 적 변환을 제공하는 함수 유형이 포함되므로 유형 확장이 가능합니다. 암시 적 변환 외에도 유형 확장은 모듈 간의 하위 유형 / 수퍼 유형 관계를 선언 할 수있는 "확장"메커니즘에 의해 제공됩니다. 이 메커니즘은 상위 유형이 데이터 선언의 왼쪽에있는 유형으로 표시되고 해당 하위 유형이 오른쪽에있는 값 생성자로 표시되는 대수 데이터 유형을 시뮬레이션하는 데 사용할 수 있습니다. Scala는 최고 수준의 패턴이있는 가상화 된 패턴 매처를 사용하는 광범위한 패턴 일치 기능을 제공합니다.
Scala는 하위 유형 지정을 지원하며 이는 유형 추론을 상당히 제한합니다. 그러나 유형 추론은 시간이 지남에 따라 향상되었습니다. 더 높은 종류의 유형 추론이 지원됩니다. 그러나 Scala에는 의미있는 종류 시스템이 없으므로 종류 추론 및 종류 통합이 없습니다. 유형 변수가 도입되면 *
달리 주석이 지정되지 않는 한 종류 입니다. Any
(모든 유형의 상위 유형) 및 Nothing
( 모든 유형 의 하위 유형)과 같은 특정 유형은 유형 인수에 적용 할 수 없지만 기술적으로 모든 유형입니다.
Scala 프로그래머에게 Haskell :
Haskell은 순전히 기능적인 언어입니다. 이것은 함수가 어떠한 부작용도 가질 수 없음을 의미합니다. 예를 들어, Haskell 프로그램은 화면에 인쇄하지 않지만 IO[_]
IO 하위 시스템이 수행 할 일련의 작업을 설명하는 데이터 유형 의 값을 반환하는 함수입니다 .
Scala는 기본적으로 엄격하고 엄격하지 않은 함수 인수에 대한 "이름 별"주석을 제공하는 반면, Haskell은 기본적으로 "필요한"의미 체계를 사용하여 게으르고 엄격한 인수에 대한 주석을 제공합니다.
Haskell의 유형 추론은 완전한 추론을 가진 Scala보다 더 완벽합니다. 이것은 타입 어노테이션이 거의 필요하지 않다는 것을 의미합니다.
GHC 컴파일러에 대한 최근 확장은 Rank-n 유형, 유형 계열 및 유형 다형성과 같이 Scala에 상응하지 않는 고급 유형 시스템 기능을 허용합니다.
Haskell에서 모듈은 유형과 함수의 모음이지만 모듈은 일류 엔티티가 아닙니다. 암시 적은 유형 클래스에 의해 제공되지만 일단 선언되면 전역 적으로 범위가 지정되며 Scala 에서처럼 명시 적으로 전달할 수 없습니다. 특정 유형에 대한 유형 클래스의 여러 인스턴스는 newtype
명확하게 하기 위해 로 래핑하여 해결되는 반면, Scala에서는 단순히 범위를 지정하거나 인스턴스를 명시 적으로 전달하여 해결됩니다.
Haskell은 "객체 지향"이 아니기 때문에 방법 / 기능 이분법이 없습니다. 모든 함수는 1 급이며 모든 함수는 기본적으로 커리됩니다 (Function1, Function2 등 없음).
Haskell에는 하위 유형 메커니즘이 없지만 유형 클래스는 하위 클래스 관계를 가질 수 있습니다.
나는 누구도 Haskell (GHC의 타입 시스템에서 예시 된 것처럼)을 Scalas와 체계적으로 비교했다고 생각하지 않습니다. 주요 차이점은 유형 추론의 정도와 상위 유형에 대한 지원입니다. 그러나 차이점에 대한 완전한 처리는 출판 가능한 결과가 될 것입니다.
'Programing' 카테고리의 다른 글
ELMAH를 사용하는 WCF 서비스에 대한 예외 로깅 (0) | 2020.11.28 |
---|---|
데이터베이스 호출에 대한 단위 테스트를 작성하는 방법 (0) | 2020.11.28 |
8 자 전용 UUID 생성 (0) | 2020.11.28 |
Jenkins (Hudson)에서 플러그인을 제거하려면 어떻게해야합니까? (0) | 2020.11.28 |
R 패키지 개발 버전을 설치하는 방법 github 저장소 (0) | 2020.11.28 |