2012-02-19 3 views
5

모든 공통된 동작을하고 싶습니다. 내 문제는 다음 코드에 설명되어 있습니다 :Haskell 컨텍스트 오류에서 ...을 추론 할 수 없습니다.

 
example.hs:19:14: 
    Could not deduce (a ~ T) 
    from the context (A a, B b) 
     bound by the type signature for method :: (A a, B b) => Y -> a -> b 
     at example.hs:(17,5)-(19,18) 
     `a' is a rigid type variable bound by 
      the type signature for method :: (A a, B b) => Y -> a -> b 
      at example.hs:17:5 
    In the pattern: N 
    In an equation for `method': method _ N = R 
    In the instance declaration for `X Y' 

example.hs:19:18: 
    Could not deduce (b ~ U) 
    from the context (A a, B b) 
     bound by the type signature for method :: (A a, B b) => Y -> a -> b 
     at example.hs:(17,5)-(19,18) 
     `b' is a rigid type variable bound by 
      the type signature for method :: (A a, B b) => Y -> a -> b 
      at example.hs:17:5 
    In the expression: R 
    In an equation for `method': method _ N = R 
    In the instance declaration for `X Y' 
Failed, modules loaded: none. 

나는이 경우 무엇을해야 하는지를 딱하다 :이 모듈을로드 할 때

 
class A a 
class B b 

class X x where 
    method :: (A a, B b) => x -> a -> b 

data T = L | M | N 
data U = P | Q | R 

instance A T 
instance B U 

data Y = ZZZ 

instance X Y where 
    method _ L = P 
    method _ M = Q 
    method _ N = R 

, 나는 다음과 같은 오류가 발생합니다. T와 U가 A와 B의 인스턴스 인 경우에도이 오류가 발생합니다. method에서 고정 유형 값을 반환 할 수없는 경우이 부분을 어떻게 코딩합니까?

+0

가능한 데이터 형식 목록 : "컨텍스트에서 (a ~ SomeType)을 추론 할 수 없습니다 (SomeTypeclass a)"] (http://stackoverflow.com/questions/5453514/lists-of-data-types -could-not-deduce-a-sometype-from-the-context-sometype) – Landei

답변

9

method유형 a(a, b)AbB의 인스턴스의 인스턴스의 모든 쌍의 작품,하지만 당신은 정의가 두 개의 특정 유형에서만 작동 할 것을 약속 method :: (A a, B b) => x -> a -> b 서명.

이것은 자바와 같은 인터페이스와 근본적으로 다르며, 호출자가 인터페이스 X가 구현된다는 것을 알리는 유일한 피 호출자입니다. Haskell에서는 호출자가 어떤 시그니처를 사용했는지 결정합니다 (여기서 두 번째 인수로 전달되는 타입과 반환 될 타입이 결정됨). 피 호출자는 요구 된 기능을 제공 할 수 있어야합니다. 유형은 필수 클래스의 인스턴스입니다. 당신이 이야기 할 것이다, 그래서 그 클래스의 인스턴스의 값을 각각 분석 구성하는 클래스 AB 어떤 방법없이

, 당신은 (인해 seq에 undefinedness의 다양한도 가능) undefined보다 다른 method를 구현할 수 없습니다 사실 TU을 사용하는 세계입니다.

또 다른 방법은, X 다중 매개 형 클래스를 만들 그러나

{-# LANGUAGE MultiParamTypeClasses #-} 

class (A a, B b) => X x a b where 
    method :: x -> a -> b 

, 그 인스턴스를 해결하기 위해 함수 종속이 필요할 수 있습니다. 또 다른 방법은, 관련 유형을 사용하는 것입니다

그것은 (다니엘 피셔에 의해 언급 된 이유로) 귀하의 예를 구출 할 수있는 방법에 대해 생각하는 정말 어려운
{-# LANGUAGE TypeFamilies #-} 

class X x where 
    type AType x 
    type BType x 
    method :: x -> AType x -> BType x 

instance X Y where 
    type AType Y = T 
    type BType Y = U 
    method ... 
+0

나는 당신의 요점을 얻었다. 나는 타입 클래스 Y, T, U가 함께 작동합니다. 나는 함께 일하는 Y1, T1, U1 타입 클래스의 또 다른 트리플렛을 가지고 있습니다. 내 문제는 이러한 유형 - 클래스 모델의 인스턴스를 형성합니다. 이 모델을 구현하는 방법을 신경 쓰지 않고 이러한 모델에서 작동하는 공통 코드를 갖고 싶습니다. 문제를 지적 해 주셔서 감사합니다. 이런 종류의 코드는 자바와 마찬가지로 언어에서도 문제가 될 수 있습니다. – mutelogan

+0

추가 가능한 대안 –

+0

설명해 주셔서 감사합니다. – mutelogan

3

. 전혀 관계가없는 두 가지 유형의 클래스 A와 B가있는 경우 어떻게 일반 연결을 설정해야합니까? 그래서 당신은 함께 모두를 넣을 수 있지만, 나는 이것이 당신이 원하는 것을 의심 :

{-# LANGUAGE MultiParamTypeClasses #-} 

class A2B a b where 
    convert :: a -> b 

data T = L | M | N 
data U = P | Q | R 

instance A2B T U where 
    convert L = P 
    convert M = Q 
    convert N = R 

data Y = ZZZ 

class X x where 
    method :: (A2B a b) => x -> a -> b 

instance X Y where 
    method _ t = convert t 

그리고이 디자인은 매우 안정되지 중 하나를 옆에 A2B T V 같은 인스턴스를 할 때 문제가 얻을 것이다 A2B T U.

관련 문제