2016-11-18 3 views
2

Я пытаюсь сделать экземпляр Functor для следующих типов данных:Типа не полиморфные, как предложил

data Event t a = Event { runEvent :: t -> ([a], Event t a) } 

instance Functor (Event t) where 
    fmap :: (a -> b) -> Event t a -> Event t b 
    fmap f e = Event go 
     where 
      go t = (fmap f x, e') 
       where 
        (x, e') = Event.runEvent e t 

Но компиляция терпит неудачу со следующими ошибками:

E FRP.fr:11: type `γ` is not as polymorphic as suggested in 
    the annotation where just `β` is announced. 
E FRP.fr:11: type error in expression go 
    type is : ([γ],Event α β) 
    expected: ([γ],Event α γ) 

Я пытался добавить некоторые чтобы обобщить привязки let, но это не сработало.

ответ

2

Таким образом, мы имеем входящие e::Event t a

runEvent Применение к e дает нам еще во второй элемент кортежа в Event t a, это не так? Но это должно быть Event t b, правильно?

(ошибка довольно запутанная, так как оно возникает соотва. go и использует переменные свежий тип, которые были использованы при проверке типа go)

+0

Добавления аннотации типа, чтобы пойти помочь. –

Смежные вопросы