2012-05-16 5 views
-1

저는 정말 haskell의 수업에 대해 혼란스러워합니다. 코드가있는 경우 :하스켈에서 타입 클래스는 어떻게 작동합니까?

class GetResult n where res :: n -> Int 
class (GetResult n) => Model n where 
            starting :: Int -> [Int] -> n 
            starting i j = ..... 
            test :: n -> n 
            test n = ...... 

어떤 유형이 n입니까? 어떤 유형의 출력과 테스트가 입력으로 사용됩니까?

+1

OO 백그라운드에서 왔을 때, OO 클래스가 아닌 (일반) 인터페이스로 항상 haskell 클래스를 생각해보십시오. 그것들은 완전히 동등한 것은 아니지만 훨씬 더 좋은 근사를 제공합니다. – phg

답변

4

하스켈의 유형 클래스가 OO의 클래스와 아무 관련이 없다는 혼란이있을 수 있습니다. 가장 중요한 유형 클래스는 객체를 설명하지 않으며 유형을 설명합니다.

유형 클래스는 일련의 메소드를 설명합니다. 특정 유형에 대해 해당 메소드를 구현하여 해당 유형을 클래스의 인스턴스로 만들 수 있습니다. GetResult의 타입 클래스 정의는 "n -> Int 타입의 메소드 res을 구현하여 GetResult의 인스턴스로 만들 수있는 타입 A"로 읽을 수 있습니다. 따라서 n은 단순히 GetResult의 인스턴스가되기를 원하는 유형입니다. Int 것이 경우 n에서

instance GetResult Int where 
    res :: Int -> Int 
    res i = i 

: 당신이, 당신은 다음과 같은 예를 선언을 사용할 수 IntGetResult의 인스턴스를 만들고 싶었다 경우 예를 들어

.

4

n은 특정 유형이 아닌 유형 변수입니다. 특정 유형은 GetResultModel의 인스턴스로 만들 수 있으며 각 인스턴스는 클래스에 정의 된 함수의 유형에서 "공백을 채 웁니다".

그래서 starting의 전체 유형 (당신이 :t starting과 ghci에서이를 얻을 수 있습니다)입니다 :

starting :: Model n => Int -> [Int] -> n 

당신은 Model의 인스턴스의 모든 유형 "으로 이것을 읽을 수 starting가 취하는 Int 및 a [Int] 그리고 해당 유형의 값을 반환합니다 ". 마찬가지로 testModel의 인스턴스 인 모든 유형을 취해 동일한 유형의 값을 반환합니다.

특히starting으로 전화를 걸면 반환되는 유형은 컨텍스트에 의해 결정됩니다. 그 문맥에서 반환 값이 사용되는 모든 유형의 값을 반환합니다 (적절한 인스턴스가 있다고 가정).

관련 문제