2017-05-13 21 views
0

저는 this paper을 읽고 있습니다. 그리고 그것은 Monoids가 팬텀 응용 펑터라고 말합니다.PureScript에서 팬텀 응용 펑터를 만드는 방법은 무엇입니까?

purycript에 팬텀 유형을 설정하려고 시도했지만 Functor 인스턴스에 유형 오류가 발생합니다. 내 생각 엔 컴파일러는 a이지도를 작성한 후 Accy o a에 무엇이 있는지 모른다. 어떻게 수정하겠습니까?

newtype Accy o a = Accy { acc :: o } 

instance mapaccy :: (Monoid o) => Functor (Accy o) where 
    map f (Accy { acc : a }) = Accy { acc : (f a) } 

instance maccy :: (Monoid o) => Apply (Accy o) where 
    apply (Accy { acc : f }) (Accy { acc : a }) = (Accy { acc : f <> a }) 

instance mpp :: (Monoid o) => Applicative (Accy o) where 
    pure _ = Accy { acc : mempty } 

instance msemi :: (Monoid o) => Semigroup (Accy o a) where 
    append (Accy { acc : a }) (Accy { acc : b }) = Accy { acc : (a <> b) } 


map f (Accy { acc : a }) = Accy { acc : (f a) } 
             ^
    Could not match type  
    o2  
    with type  
    a0  
    while checking that type t1 
    is at least as general as type a0 
    while checking that expression a 
    has type a0 
    in value declaration mapaccy 
+1

'Accy o'는 상수 functor입니다. 'f : a-> b' 함수를'map '하는 것은'f '를 무시해야하는'map f :: Accy oa -> Accy ob'를 생성 할 것입니다.'a' 타입의 인자가 없기 때문에 ('o '가능). – chi

답변

3

내 문제가 있습니다. 지도 기능은 Accy o을 통해 매핑하므로 map :: (a -> b) -> f a -> f b에있는 a은 액세스 할 수없는 팬텀 유형입니다.

Functor 인스턴스에서 f를 무시해야하는 것처럼 보입니다.

instance mapaccy :: (Monoid o) => Functor (Accy o) where 
    map f (Accy { acc : a }) = Accy { acc : a }