0

これはコンパイルします

foo ma = case ma of
  [Just a] -> newRVar 0 >>= a

view                :: forall a eff. 
                       M.Map String (Linker Number a eff) -> 
                       String -> 
                       Eff (reactive :: Reactive | eff) Unit
view         m yaml = case parseYAML yaml           of
  Right (View xs)  -> case (flip M.lookup) m <$> xs of
    (as)       -> foo as

これはしません

foo ma = case ma of
  Just a -> newRVar 0 >>= a

view                :: forall a eff. 
                       M.Map String (Linker Number a eff) -> 
                       String -> 
                       Eff (reactive :: Reactive | eff) Unit
view         m yaml = case parseYAML yaml           of
  Right (View xs)  -> case (flip M.lookup) m <$> xs of
    (as)       -> foo <$> as

次のエラーで:

 Cannot unify Control.Monad.Eff.Eff (reactive :: Control.Reactive.Reactive | u8437) u8438 with Prelude.Unit.

なんで?

4

1 に答える 1

1

エラー メッセージは、 を配置すべきControl.Monad.Eff.Eff (reactive :: Control.Reactive.Reactive | u8437) u8438場所に配置していることを示していますUnit

foo型宣言はありますか?view現在、型クラス制約の推論が不足しているため、で何を行っているかに関係なく、これなしではおそらく機能しません。

2 番目のケースでは、タイプは次のとおりです。

foo :: forall a eff. Maybe a -> Eff (reactive :: Control.Reactive.Reactive | eff) a

のタイプ(<$>)

(<$>) :: forall f a b. (Functor f) => (a -> b) -> f a -> f b

の型は にasなるのでMaybe (Linker Number a eff)、型の置換を開始すると、どこで問題が発生するかがすぐにわかります。

a ~ Maybe (Linker Number a1 eff)
b ~ Eff (reactive :: Control.Reactive.Reactive | eff) (Linker Number a1 eff)
f ~ Maybe

したがって、のf b結果タイプfoo <$> asは次のとおりです。

Maybe (Eff (reactive :: Control.Reactive.Reactive | eff) (Linker Number a1 eff))
于 2014-08-08T15:19:06.847 に答える