2012-07-16 5 views
8

총체적인 여기의, 안간힘없는.하스켈 : 세트에 대한 타입 클래스를 어떻게 정의 할 수 있습니까?

세트에 대한 유형 클래스를 정의하려고합니다. 이 경우에는 '존재'의 정의 만 필요합니다. '존재'는 설정 항목에 대해 집합과 기능을 취하고 을 부울로 반환합니다. 하스켈에서 어떻게 정의 할 수 있습니까?

올바른 방향으로 다음과 같은 메시지가 표시됩니까? 클래스에 대한 너무 많은 매개 변수`설정 :

이 이 이

이 (결과 - 그래서 형 클래스 정의와 '존재'지금 true를 반환하는 목록과 세트의 구현 ..

-- Set.hs -- 

class Set a b where 

    exists :: a -> (b -> Bool) -> Bool 


-- ListSet.hs -- 

instance Set ListSet a where 

    exists a f = True 

이있다 ')

답변

13

충분한 확장자로 이렇게 할 수 있습니다. 적어도 다중 매개 변수 유형 클래스가 필요합니다. 그러나 사용하는 것은 매우 귀찮을 것입니다. 즉, 장소 전체에 명시 적 형식 서명을 지정해야합니다. 도

class Set a b | a -> b where 
    exists :: a -> (b -> Bool) -> Bool 

이 당신이 세트의 종류를 알고 있다면, 당신은 요소의 유형을 알고 있다고 말한다 : 그것을 해결하는 한 가지 방법은 (다른 확장자를 사용) 기능 의존성을 소개하는 것입니다. 여기

class Set f where 
    exists :: f a -> (a -> Bool) -> Bool 

이 유형의 클래스가 높은 kinded 종류 이상의 범위, 깔끔한 트릭과 하드를 당신이 적이없는 경우 스스로 마련하는 그러나, 확장자없이 작동하는 간단한 방법이있다 전에 본!

+1

물론, 후자는 요소 유형을 집합 유형에 대한 마지막 유형 매개 변수로 요구합니다. 'a -> Bool'에 대한 인스턴스를 작성하려는 경우처럼 항상 가능한 것은 아닙니다. 반면에 연관 형 패밀리는이를 해결할 수 있습니다. – Carl

+2

감사합니다. 나는 두 번째 방법으로 일하고있어! 나는 거기에 무슨 일이 일어나는지 잘 이해하지 못함을 인정해야하지만, 잘하면 그것은 나 자신을 드러낸다. – tero

7

다니엘 바그너 (Daniel Wagner)는 이미 여러분이하려는 일에 대해 완벽한 답을주었습니다. 오류에 대한 요점을 추가하고 싶습니다. Too many parameters for class 'Set'. 이는 해당 GHC 확장 (MultiParamTypeClasses)을 활성화하지 않았 음을 의미합니다. 당신은 소스 파일의 상단에 주석의 특별한 종류를 지정하여 작업을 수행 할 수 있습니다

{-# LANGUAGE MultiParamTypeClasses #-} 
-- 
-- Your source code here 
-- 

그런 다음 당신은 당신의 코드를 컴파일 할 수 있어야한다.

Daniel의 대답에서 언급 된 또 다른 Haskell 기능은 특정 확장 인 FunctionalDependencies (이것은 유형이 클래스 선언의 이상한 .. | a -> b ..입니다)을 사용하도록 설정해야합니다. 당신은 다음과 같이 쉼표를 사용하여 동시에 여러 확장 기능을 활성화 할 수 있습니다

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} 

칼의 의견 또한 (세트 유형 또는 기타의 제네릭 클래스를 무엇을하려고 수단을 제공 할 수있는 또 다른 확장, TypeFamilies을 언급 컬렉션의 종류). 여기에서 읽을 수 있습니다 : http://www.haskell.org/haskellwiki/Type_families.

+0

나는 기능적 의존성 방법으로도 그것을 할 수 있었다. 그러나 'FlexibleInstances'확장을 포함해야했습니다. – tero

관련 문제