2017-01-29 2 views
3

매핑 할 레코드가 있습니다. 레코드 요소는 이종 유형이지만 더 높은 종류의 유형입니다.이기종 요소 유형으로 레코드를 매핑하는 방법

data U a = U a 
data V a = V a 

data R a = R {x :: a Int, y :: a String } 

fromU2V (U a) = V a 

r1 = R { x: U 1, y: U "yo!" } 

map f (R { x: x, y: y }) = R { x: f x, y: f y } 

r2 = map fromU2V r1 
-- :type r2 => R V 

어떻게해야합니까? 코드가 Purescript에

답변

4

가 높 : 위의 코드는 내가 기능 f 여기

PS 특정 유형에의 것으로 추정된다고 가정

map f (R { x: x, y: y }) = R { x: f x, y: f y } 
              ^^^ 

    Could not match type 
     String 
    with type 
     Int 

라인에 나에게 오류를 제공 이 map과 같은 순위 유형은 일반적으로 유추 될 수 없습니다 (적어도 현재는 그렇지 않습니다). 사용 동등

map :: forall f g. (forall a. f a -> g a) -> R f -> R g 
map f (R { x: x, y: y }) = R { x: f x, y: f y } 

또는 서곡에 정의 된 NaturalTransformation type synonym :

map :: forall f g. (f ~> g) -> R f -> R g 
을 당신이 유형의 서명을 추가해야합니다 생각