programing

Scala 유형 시스템과 Haskell의 단점은 무엇입니까?

goodcopy 2021. 1. 18. 22:04
반응형

Scala 유형 시스템과 Haskell의 단점은 무엇입니까?


나는 Scala의 유형 시스템이 Java 상호 운용성에 의해 약화되어 Haskell의 유형 시스템과 동일한 기능을 수행 할 수 없다는 것을 읽었습니다. 이것이 사실입니까? 유형 삭제로 인한 약점입니까, 아니면 모든면에서 잘못입니까? 이 차이가 Scala에 유형 클래스가없는 이유입니까?


큰 차이점은 Scala에는 Hindley-Milner 전역 유형 추론이없고 대신 로컬 유형 추론의 한 형태를 사용하므로 메서드 매개 변수에 대한 유형과 오버로드 된 또는 재귀 함수에 대한 반환 유형을 지정해야합니다.

이것은 유형 삭제 또는 JVM의 다른 요구 사항에 의해 주도되지 않습니다. 여기에 가능한 모든 어려움을 극복 할 수 있고,왔다, 다만 고려 Jaskell - http://docs.codehaus.org/display/JASKELL/Home

HM 추론은 객체 지향 컨텍스트에서 작동하지 않습니다. 특히 유형 다형성이 사용되는 경우 (유형 클래스의 임시 다형성과 반대). 이는 다른 Java 라이브러리와의 강력한 상호 운용성 및 JVM에서 가능한 최상의 최적화를 얻기 위해 (적은 정도는 아니지만) 중요합니다.

Haskell 또는 Scala가 더 강력한 유형 시스템을 가지고 있다고 말하는 것은 실제로 타당하지 않습니다. 두 언어 모두 유형 기반 프로그래밍의 경계를 서로 다른 방향으로 확장하고 있으며 각 언어는 다른 언어로 복제하기 어려운 고유 한 장점을 가지고 있습니다.


Scala의 유형 시스템은 Haskell의 유형 시스템과 다르지만 Scala의 개념은 때때로 Haskell의 강점과 지식이 풍부한 연구원 및 전문가 커뮤니티에서 직접 영감을 얻었습니다.

물론 기본적으로 함수형 프로그래밍이 아닌 VM에서 실행하면이 플랫폼을 대상으로하는 기존 언어와의 호환성 문제가 발생합니다. 유형에 대한 대부분의 추론은 컴파일 시간에 발생하기 때문에 런타임시 Java (언어 및 플랫폼)의 한계는 걱정할 필요가 없습니다 (정확히이 버그가 Java에 통합되는 것처럼 보이지만 Type Erasure 제외). 보다 원활한 생태계).

내가 아는 한 Java를 사용하는 유형 시스템 수준에서 유일한 "타협"은 원시 유형을 처리하는 특수 구문입니다. Scala는 더 이상 원시 유형을 허용하지 않지만 해당 버그가있는 이전 Java 클래스 파일을 허용합니다. 아마도 List[_](또는 더 긴 동등한 코드)와 같은 코드를 보았을 것 List[T] forSome { type T }입니다. 이것은 Java와의 호환성 기능이지만 내부적으로도 실존 유형으로 취급되며 유형 시스템을 약화시키지 않습니다.

Scala의 유형 시스템은 Haskell보다 더 자세한 방식으로 유형 클래스를 지원 합니다 . 나는이 논문을 읽는 것이 좋습니다. 이것은 Scala의 타입 시스템의 상대적인 강점에 대해 다른 인상을 줄 수 있습니다 (17 페이지의 표는 매우 강력한 타입 시스템 개념의 좋은 목록입니다).

스칼라와 하스켈의 컴파일러가 타입을 추론하기 위해 사용하는 접근 방식은 타입 시스템의 힘과 반드시 ​​관련이있는 것은 아니지만, 사람들이 코드를 작성하는 방식에 약간의 영향을 미칩니다. 강력한 유형 추론 알고리즘을 사용하면 더 추상적 인 코드를 작성할 가치가 있습니다 (모든 경우에 이것이 좋은 것인지 스스로 결정할 수 있습니다).

결국 Scala와 Haskell의 유형 시스템은 사용자에게 문제를 해결하기위한 최상의 도구를 제공하려는 욕구에 의해 주도되지만 그 목표에 대해 다른 경로를 택했습니다.


고려해야 할 또 다른 흥미로운 점은 Scala가 고전적인 OO 스타일을 직접 지원한다는 것입니다. 즉, 하위 유형 관계가 있습니다 (예 : List는 Seq의 하위 클래스 임). 그리고 이것은 타입 추론을 더 어렵게 만듭니다. 여기에 스칼라에서 트레이 트를 혼합 할 수 있다는 사실을 추가하십시오. 이는 주어진 유형이 여러 상위 유형 관계를 가질 수 있음을 의미합니다 (아직 더 까다 로움).


Scala에는 rank-n 유형 이 없지만 특정 경우에 이러한 제한 사항 을 해결할 수 있습니다.


나는 Haskell에 대한 경험이 거의 없지만 Haskell과 다른 Scala 유형 시스템에 주목하는 가장 분명한 것은 유형 추론입니다.

Scala에는 전역 유형 추론이 없으며 함수 인수 유형을 명시 적으로 알려야합니다.

예를 들어, Scala에서는 다음과 같이 작성해야합니다.

def add (x: Int, y: Int) = x + y

대신에

add x y = x + y

모든 종류의 유형에 "+"메서드가있는 추가 함수의 제네릭 버전이 필요한 경우 문제가 발생할 수 있습니다. 이에 대한 해결 방법이 있지만 더 자세한 정보가 제공됩니다.

그러나 실제로 사용하면 Scala의 유형 시스템이 매일 사용하기에 충분히 강력하다는 것을 알았습니다. 저는 일반적으로 이러한 해결 방법을 거의 사용하지 않습니다. 아마도 Java 세계에서 왔기 때문일 수 있습니다.

그리고 인수의 유형을 명시 적으로 선언하는 제한은 나쁜 일이 필요하지 않습니다. 어쨌든 문서화해야합니다.


튜링을 줄일 수 있습니까?

Oleg Kiselyov의 페이지 http://okmij.org/ftp/ 참조 ... 하스켈의 유형 시스템에서 람다 미적분을 구현할 수 있습니다. Scala가 그렇게 할 수 있다면 어떤 의미에서 Haskell의 유형 시스템과 Scala의 유형 시스템은 동일한 유형을 계산합니다. 질문은 다음과 같습니다. 하나가 다른 것보다 얼마나 자연스러운가요? 하나가 다른 것보다 얼마나 우아합니까?

참조 URL : https://stackoverflow.com/questions/3689407/disadvantages-of-scala-type-system-versus-haskell

반응형