2014-04-06 6 views

답변

4

PolyTypeEither Int String과 같습니다. 둘 다 Int에 대해 정의되는 함수를 해제 만 할 수 있습니다, 그래서 당신은

liftP :: (Either Int String -> a) -> PolyType -> a 
liftP f poly = case poly of 
    PT_Int i -> f (Left i) 
    PT_String s -> f (Right s) 

PolyType 포함

같은 기능 중 하나 Int 또는 String을 가질 수

data Either a b = Left a | Right b 

: 혹시 전에 Either을 보지 못했다 및 String.

그건 그렇다고 생각하지 않습니다. 일반적으로 "리프팅"이라는 용어는 [a], Maybe a, (->) a 또는 일반적으로 어떤 유형 f af :: * -> *과 같은 다형성 데이터 유형의 컨텍스트에서 사용됩니다.

이 경우 함수가 g :: a -> b 인 경우 [a] -> [b], Maybe a -> Maybe b 또는 일반적으로 f a -> f b이 필요합니다. 정확히 fmap에서 Functor까지입니다.

class Functor f where 
    fmap :: (a -> b) -> (f a -> f b) 

하지만 PolyType은 단형이다 (그것의 종류의 무료 변수가 없습니다. 정확히 말하면, 그것은 종류의 *이 있습니다) 그래서 그것은 Functor 수 없습니다.

이제이이

data PolyType a = PT a 

PolyType의 당신의 정의를 변경 chould 유효한 Functor (그것의 단지 IdentityFunctor)

instance Functor PolyType where 
    fmap f (PT a) = PT (f a) 

이 특정 PolyType 예를 들어 전문 fmap 함수의 유형 ()는

fmap :: (a -> b) -> PolyType a -> PolyType b