최소한의 예제 코드 :모호한 유형
는class IntegralAsType a where
value :: (Integral b) => a -> b
class (Num a, Fractional a, IntegralAsType q) => Zq q a | a -> q where
changeBase:: forall p b . (Zq q a, Zq p b) => a -> b
newtype (IntegralAsType q, Integral a) => ZqBasic q a = ZqBasic a deriving (Eq)
zqBasic :: forall q a . (IntegralAsType q, Integral a) => a -> ZqBasic q a
zqBasic x = ZqBasic (mod x (value (undefined::q)))
instance (IntegralAsType q, Integral a) => Zq q (ZqBasic q a) where
changeBase (ZqBasic x) = fromIntegral (value (undefined::p)) -- ZqBasic is an instance of Num
저는 여기에 달성하기 위해 노력하고있어에 약간의 배경이있다 : IntegralAsType 다른 계수와 두 숫자의 추가 같은 것을 방지하여 컴파일시에 안전을 입력 보장 . ZqBasic은 Zq 타입의 내부 표현이며, 다른 것들이 있습니다. 이것이 Zq가 정의 된 방식입니다. 목표는 내부 표현에 투명한 시스템을 얻는 것입니다.
내 문제는 changeBase 함수에 있습니다. 나는 'p'타입에 대해 명시 적 forall을 사용하고 있습니다. 그러나 여전히 "모호한 타입 변수 a0"(IntegralAsType a0)은 값의 사용으로 인해 발생합니다. "
왜 나는 혼란 스럽습니다. 이 오류가 발생했습니다. 특히 이전 글에서는 changeBase 함수와 동일한 설정을 가진 것처럼 보이는 "zqBasic"함수와 같은 도움을 받았습니다. 명시 적 한정사 'forall q a'를 추가하여 zqBasic에서 모호한 변수 오류를 수정했습니다. 이 한정 기호가 없으면 모호한 유형 변수 오류가 발생합니다. 왜 한정자가 필요한지 이해하지만 changeBase에 도움이되지 않는 이유는 모르겠다.
감사
추가 참고 사항 : ScopedTypeVariables, FlexibleInstances, MultiParamTypeClasses 및 FunctionalDependencies 확장을 사용하고 있습니다.위의 코드는 'undefined :: p'가 'changeBase'의 (undefined :: q)로 대체 될 때 작동합니다. – crockeea