type PT_Int = Int
type PT_String = String
data PolyType = PT_Int Int | PT_String String
주어진 함수 f를 통해 어떻게 그것을 PolyType으로 올리는 함수를 작성합니까? (그냥 들어 올리려고하는 것)데이터 타입으로 들어 올리기 (Haskell)
type PT_Int = Int
type PT_String = String
data PolyType = PT_Int Int | PT_String String
주어진 함수 f를 통해 어떻게 그것을 PolyType으로 올리는 함수를 작성합니까? (그냥 들어 올리려고하는 것)데이터 타입으로 들어 올리기 (Haskell)
PolyType
은 Either 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 a
인 f :: * -> *
과 같은 다형성 데이터 유형의 컨텍스트에서 사용됩니다.
이 경우 함수가 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
(그것의 단지 Identity
Functor
)
instance Functor PolyType where
fmap f (PT a) = PT (f a)
이 특정 PolyType
예를 들어 전문 fmap 함수의 유형 ()는
fmap :: (a -> b) -> PolyType a -> PolyType b