无法推断超类
在下面的代码,GHC找不到定义的函子实例Monoidal
实例。
为什么GHC没有推断出,如果Applicative
约束得到满足,那么Functor
必须已经在某个地方? (这个推理能力是否有名字?)
import Prelude hiding (Applicative (..), Monad (..))
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class Functor f => Monoidal f where
unit::f ()
(*) ::f a -> f b -> f (a,b)
instance Applicative f => Monoidal f where
unit = pure ()
a * b = undefined
我知道当然可以给Monoidal
添加一个明确的Functor f
约束来避免错误,但是我的问题更多的是为什么实例解析能够以这种方式工作
import Prelude hiding ((*), Applicative (..), Monad (..))
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class Functor f => Monoidal f where
unit::f ()
(*) ::f a -> f b -> f (a,b)
instance (Applicative f, Functor f) => Monoidal f where
unit = pure ()
a * b = (pure (,) <*> a <*> b )
instance (Monoidal f, Functor f) => Applicative f where
pure x = fmap (_ -> x) unit
mu <*> mx = fmap ((f, x) -> f x) ((mu * mx) :: f (a -> b, a))
对我来说看起来像一个bug。 这是一个最小的文件,它显示了这个问题,并不依赖任何丑陋的重命名Prelude
或undefined
s。
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
class A x
class A x => B x
class A x => C x
instance B x => C x
我建议用这个文件(或者非常喜欢它)向GHC bug跟踪器提交一个bug。 需要发现B x
意味着A x
的推理应该是可能的。