유형 클래스의 수학적 (범주) 설명


14

기능적 언어는 객체가 유형과 형태 기능인 카테고리 로 볼 수 있습니다 .

이 모델에서 타입 클래스 는 어떻게 맞습니까?

필자는 대부분의 유형 클래스가 가지고 있지만 Haskell로 표현되지 않은 제약 조건을 만족시키는 구현만을 고려해야한다고 가정합니다. 예를 들어, 우리는 Functorwhich fmap id ≡ idfmap f . fmap g ≡ fmap (f . g).

또는 유형 클래스에 대한 다른 이론적 기초가 있습니까 (예 : 유형이 지정된 람다 계산법을 기반으로)?


1
모델을 정확히 원하는 것에 대해보다 명확하게 설명하고 싶을 수도 있습니다. 공개 세계 가정, 인스턴스 확인 동작, 다양한 GHC 확장의 상호 작용 등을 엄격하게 설명 할 수있는 것을 원한다면 이상적인 버전보다 다소 복잡합니다. 마찬가지로 Hask를 논의 할 때 바닥이 무시되는 경우가 많습니다.
CA McCann

4
타입 클래스는 보편적 인 대수적 의미에서 시그니처 로 생각할 수 있습니다 . 동일한 시그니처 (같은 유형 클래스의 요소)를 공유하는 모든 엔티티의 콜렉션은 다양 합니다.
Dave Clarke

1
@DaveClarke : 더 높은 종류의 형식 클래스를 그런 식으로 설명하는 방법은 나에게 명백하지 않지만, 보편적 대수학에 익숙하지 않으며 여러분이 생각하는 서신을 오해 할 수도 있습니다 ...
CA McCann

1
@ camccann : 통신이 얼마나 멀리 있는지 잘 모르겠습니다. 그것은 좋은 출발점처럼 보였습니다.
Dave Clarke

2
@camccann : 대수를 정의하는 기본 범주를 변경하십시오 .num과 같은 기본 유형 클래스는 haskell 유형 (또는 Hsk 카테고리의 객체)에 대한 서명이고 유형 생성자에 대한 유형 클래스는 functors 범주에 대한 대수입니다 Hask에서 Hask까지 보편적 대수학은 범주 이론에서 대수학의 개념에 의해 완전히 포함됩니다. 또한 : Dave : 의견을 답변으로 바꿔야합니다.
코디

답변:


18

이 모델에서 타입 클래스는 어떻게 맞습니까?

짧은 대답은 그렇지 않습니다.

강제 다형성, 유형 클래스 또는 임시 다형성을위한 다른 메커니즘을 언어에 도입 할 때마다 직면하는 주요 디자인 문제는 일관성 입니다.

기본적으로 유형이 지정된 프로그램이 단일 해석을 갖도록 유형 클래스 결정이 결정적이어야합니다. 예를 들어, 동일한 범위에서 동일한 유형에 대해 여러 인스턴스를 제공 할 수 있으면 다음과 같이 모호한 프로그램을 작성할 수 있습니다.

class Blah a where
   blah : a -> String 

instance Blah T where
   blah _ = "Hello"

instance Blah T where
   blah _ = "Goodbye"

v :: T = ...

main :: IO ()
main = print (blah v)  -- does this print "Hello" or "Goodbye"?

컴파일러가 선택한 인스턴스의 선택에 따라 또는 blah v중 하나 "Hello"와 같을 수 있습니다 "Goodbye". 따라서 프로그램의 의미는 프로그램의 구문에 의해 완전히 결정되는 것이 아니라 컴파일러가 만드는 임의의 선택에 의해 영향을받을 수 있습니다.

이 문제에 대한 Haskell의 솔루션은 각 유형에 각 유형 클래스마다 최대 하나의 인스턴스가 있어야한다는 것입니다. 이를 보장하기 위해 최상위 수준에서만 인스턴스 선언을 허용하고 모든 선언을 전체적으로 볼 수 있습니다. 이렇게하면 모호한 인스턴스 선언이 만들어지면 컴파일러에서 항상 오류를 알릴 수 있습니다.

그러나 전 세계에 선언을 선언하면 의미의 구성이 깨집니다. 복구하기 위해 할 수있는 일은 프로그래밍 언어에 대한 정교한 의미 를 부여하는 것입니다. 즉, Haskell 프로그램을보다 잘 작동하고보다 구성적인 언어로 번역하는 방법을 보여줄 수 있습니다.

이것은 실제로 타입 클래스를 컴파일하는 방법을 제공합니다. 일반적으로 하스켈 서클에서 "증거 번역"또는 "사전 전달 변환"이라고하며 대부분의 하스켈 컴파일러의 초기 단계 중 하나입니다.

타입 클래스는 프로그래밍 언어 디자인이 순수한 타입 이론과 어떻게 다른지에 대한 좋은 예입니다. 타입 클래스는 정말 멋진 언어 기능이지만 증명 이론적 관점에서 보면 악의적입니다. 이것이 Agda에 타입 클래스가 전혀없는 이유이며 Coq가 휴리스틱 추론 인프라의 일부로 만드는 이유입니다.


후보까지 주자 무엇 않습니다 denotational 의미 iyswim이는?
Ohad Kammar

1
나는 전혀 모른다.
Neel Krishnaswami

이 질문에 추가 질문이 있습니까?
Ohad Kammar

@NeelKrishnaswami : ML 모듈이 이것에 어떻게 적합한 지 아십니까? 그리고 어떤 사람이 나에게 언급 한 Agda 모듈은 어떻습니까?
Lii

1
@Lii : ML 모듈과 Agda 레코드는 훨씬 더 잘 동작하지만 주석으로 설명하기에는 너무 복잡합니다. 질문에 대해 물어 보면 나 (또는 ​​다른 사람)가 설명 할 것입니다.
Neel Krishnaswami
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.