[英]Can't deduce f = f₁ from f x = f₁ y?
{-# LANGUAGE GADTs #-}
data Foo x y where
Composition :: Foo b c -> Foo a b -> Foo a c
FMap :: Functor f => (a->b) -> Foo (f a) (f b)
asFunction :: Foo a b -> a->b
asFunction (FMap m) = fmap m
-- asFunction (Composition (FMap m) (FMap n)) = fmap m . fmap n
asFunction (Composition m n) = asFunction m . asFunction n
这按预期工作......直到您取消注释asFunction
的第二个子句! 这实际上只是其他两个模式已经匹配的特殊情况的内联版本,所以我希望它没问题。 但是( ghc-7.6.2
,或ghc-7.4.1
)
Could not deduce (f ~ f1)
from the context (b1 ~ f a1, b ~ f b2, Functor f)
bound by a pattern with constructor
FMap :: forall (f :: * -> *) a b.
Functor f =>
(a -> b) -> Foo (f a) (f b),
in an equation for \`asFunction'
...
为什么会这样,为什么不能再在其它条款吗? 在更复杂的应用程序中究竟应该做些什么来防止这种麻烦?
这可能与强制的左/右分解功能有关,该功能从 GHC 的类型推断系统中暂时删除,以支持更灵活(“不饱和”)的类型功能,然后在发现它具有类似这样的烦人效果时重新引入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.