development

Rust의 특성과 Haskell의 유형 클래스의 차이점은 무엇입니까?

big-blog 2020. 6. 22. 07:17
반응형

Rust의 특성과 Haskell의 유형 클래스의 차이점은 무엇입니까?


Rust의 특성Haskell의 형식 클래스 와 적어도 피상적으로 비슷해 보이지만 사람들은 그들 사이에 약간의 차이가 있다고 봅니다. 이러한 차이점이 무엇인지 정확히 궁금했습니다.


기본 수준에는 큰 차이가 없지만 여전히 있습니다.

Haskell은 타입 클래스에 정의 된 함수 나 값을 '메소드'로 설명합니다. 마치 특성이 둘러싼 객체의 OOP 메소드를 설명하는 것과 같습니다. 그러나 Haskell은 이들을 다르게 처리하여 OOP로 인해 객체에 고정시키는 대신 개별 값으로 취급합니다. 이것은 가장 명백한 표면 수준의 차이입니다.

Rust가 최근까지까지 할 수 없었던 한 가지는 악명 높은 타입 클래스 같은 고차 타입의 특성 이었습니다 .FunctorMonad

이는 녹 특성이 흔히 '콘크리트 유형', 즉 일반적인 논증이없는 것을 설명 할 수 있음을 의미합니다. 그러나 Haskell은 고차 함수가 다른 함수를 사용하는 방법과 비슷한 유형을 사용하는 고차 유형 클래스를 만들 수 있습니다. 우리는 Rust에서 언급 한 타입 클래스를 구현할 수 없었습니다. 왜냐하면 Haskell에서 기본적이고 필수적인 것으로 간주되는이 기능을 지원하지 않기 때문입니다. 고맙게도, 이것은 최근에 관련 항목 으로 구현되었습니다 . * 그러나 이것은 관용적 녹이 아니며 일반적으로 '핵'으로 간주됩니다.

의견에서 말했듯이 GHC (Haskell의 주요 컴파일러)는 다중 매개 변수 (예 : 많은 유형의 유형) 유형 클래스 및 유형 수준 계산을 허용하는 멋진 옵션 인 기능 종속성을 포함하여 유형 클래스에 대한 추가 옵션을 지원 한다고 언급 할 수 있습니다 그리고 타입 패밀리로 이어진다 . 내 지식으로는 Rust는 funDeps 나 type family를 가지고 있지 않지만 장래에있을 수도 있습니다. †

대체로 특성과 유형 클래스가 표면에서 동일하게 보일 수 있지만, 많은 특성을 고려할 때 더 깊이 비교할 때 많은 차이가 있습니다.


참고로, Swift는 특성에도 불구하고 높은 타이핑 메커니즘이 없습니다. 언어에 대한 향후 업데이트?

† 하스켈의 타입 클래스 (고 타입 타입 포함)에 대한 좋은 기사는 여기 에서 볼 수 있으며 , Rust의 특성에 대해서도 마찬가지로 좋은 기사 여기보관되어 있지만 불행히도 오래된 것입니다.


현재 답변이 Rust 특성과 Haskell 유형 클래스의 가장 근본적인 차이점을 간과한다고 생각합니다. 이러한 차이점은 특성이 객체 지향 언어 구성과 관련되는 방식과 관련이 있습니다. 이에 대한 정보는 Rust book을 참조하십시오 .

  1. 특성 선언은 특성 유형을 만듭니다 . 즉, 이러한 유형의 변수 (또는 유형에 대한 참조)를 선언 할 수 있습니다. 특성, 구조체 필드 및 형식 매개 변수 인스턴스화에서 특성 유형을 매개 변수로 사용할 수도 있습니다.

    특성 참조 변수는 런타임에 참조 된 오브젝트의 런타임 유형이 특성을 구현하는 한 다른 유형의 오브젝트를 포함 할 수 있습니다.

    // The shape variable might contain a Square or a Circle, 
    // we don't know until runtime
    let shape: &Shape = get_unknown_shape();
    
    // Might contain different kinds of shapes at the same time
    let shapes: Vec<&Shape> = get_shapes();
    

    이것은 타입 클래스가 작동하는 방식이 아닙니다. 유형 클래스는 유형을 생성하지 않으므로 클래스 이름으로 변수를 선언 할 수 없습니다. 형식 클래스 는 형식 매개 변수에 대한 경계 역할을 하지만 형식 매개 변수는 형식 클래스 자체가 아닌 구체적 형식으로 인스턴스화해야합니다.

    동일한 유형 클래스를 구현하는 다른 유형의 여러 가지 목록을 가질 수 없습니다. (대신 Haskell에서는 실존 형이 비슷한 것을 표현하기 위해 사용됩니다.) 주 1

  2. 특성 메소드는 동적으로 전달 될 수 있습니다 . 이것은 위 섹션에서 설명한 것과 밀접한 관련이 있습니다.

    동적 디스패치는 참조를 통해 호출되는 메소드를 판별하기 위해 참조가 가리키는 오브젝트의 런타임 유형이 사용됨을 의미합니다.

    let shape: &Shape = get_unknown_shape();
    
    // This calls a method, which might be Square.area or
    // Circle.area depending on the runtime type of shape
    print!("Area: {}", shape.area());
    

    또한 Haskell에서 실존 유형이 사용됩니다.

결론적으로

특성이 본질적으로 유형 클래스와 동일한 개념 인 것 같습니다. 또한 객체 지향 인터페이스의 기능이 있습니다.

반면 Haskell의 유형 클래스는 다중 매개 변수 유형 클래스와 같이 더 높은 종류의 유형과 확장을 가지고 있기 때문에 고급 클래스입니다. 그러나 나는 그것들이 본질적으로 동일하다고 생각합니다.


참고 1 : 최신 버전의 Rust에는 특성 이름을 유형으로 사용하고 특성 이름을 범위로 사용하는 것을 구별하기 위해 업데이트되었습니다. 특성 유형에서 이름 앞에 dyn키워드 가 붙습니다 . 자세한 내용은 예를 들어이 답변 을 참조하십시오.


Rust의 "특성"은 Haskell의 유형 클래스와 유사합니다.

Haskell과의 주요 차이점은 특성이 점 표기법 (예 : a.foo (b) 형식)이있는 표현식에만 개입한다는 것입니다.

하스켈 타입 클래스는 고차 타입으로 확장됩니다. 녹 특성은 전체 언어에서 누락되기 때문에 고차 유형 만 지원하지 않습니다. 즉 특성과 유형 클래스 사이의 철학적 차이가 아닙니다.

참고 URL : https://stackoverflow.com/questions/28123453/what-is-the-difference-between-traits-in-rust-and-typeclasses-in-haskell

반응형