2016-11-18 16 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 α γ) 

私はいくつかの追加しようとしましたレットバインディングを一般化するためにタイプアノテーションを使用しましたが、これは機能しませんでした。

答えて

2

だから我々は、着信erunEventを適用e::Event t a

はまだ私たちにタプルの2番目の要素でEvent t aを与えてきた、それはそうではないのですか?しかし、それはむしろEvent t bでしょうか?

(それがRESPを発生するため、エラーはかなり混乱しています。gogoをチェックするタイプで使用されてきた新鮮な型変数を使用しています)

+0

助け行くために型注釈を追加します。 –

関連する問題