2017-05-13 25 views
0

我正在通過this paper閱讀,它說,猿人是幻影應用仿函數。如何在PureScript中製作幻影應用仿函數?

我試着在purescript中設置一個幻像類型,但我在Functor實例中得到一個類型錯誤。我的猜測是編譯器不知道aAccy 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'是一個常量函子。 'map'任何函數'f:a-> b'會產生'map f :: Accy oa - > Accy ob'應該完全忽略'f',因爲沒有圍繞'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 }