방금 유형을 배우기 시작했습니다. GHC 문서에는 최상위 레벨 및 관련 유형 패밀리가 동일한 기능을 가지고 있지만 작성중인 코드는 패밀리가 연결될 때와 다른 방식으로 최상위 레벨에서 작동합니다. 이는 컴파일과 잘 실행 :유형 가족 : 최상위 수준 vs. 연결된
{-# LANGUAGE TypeFamilies #-}
module Test where
-- type family R a
-- type instance R Maybe = Int
class C' a where
type R a
getInt' :: a Int
getBool' :: R a -> a Bool
instance C' Maybe where
type R Maybe = Int
getInt' = Just 3
getBool' i = Just $ i < 10
printer :: IO()
printer = print $ (getBool' 5 :: Maybe Bool)
을하지만이 나에게 타입 에러 제공 :
{-# LANGUAGE TypeFamilies #-}
module Test where
type family R a
type instance R Maybe = Int
class C' a where
-- type R a
getInt' :: a Int
getBool' :: R a -> a Bool
instance C' Maybe where
-- type R Maybe = Int
getInt' = Just 3
getBool' i = Just $ i < 10
printer :: IO()
printer = print $ (getBool' 5 :: Maybe Bool)
이 나에게 동일한 모양을; 왜 컴파일되고 다른 컴파일은되지 않습니까? 나는 오른쪽 종류에만 관련된 유형의 가족을 위해 추정되는 어떤 이유가 있다고 생각하지 않습니다
type family R (a :: * -> *)
: 당신이 종류의 주석을 경우
관련 유형 패밀리는 컴파일러가 모든 클래스 인스턴스에서 하나 이상의 유형 인스턴스를 필요로한다는 점에서 만 다릅니다. 문서에서 "같은 기능"이라고 말하면 동일한 선언에 대해 의미가 동일 함을 의미하지만 올바른 위치에 선언을 배치해야합니다. 타입 패밀리를 "연관시키는"목적은 구현 자에게 그 타입 인스턴스를 정의해야 함을 상기시키는 것이다. – user2407038