无法推断超类

在下面的代码,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。 这是一个最小的文件,它显示了这个问题,并不依赖任何丑陋的重命名Preludeundefined 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的推理应该是可能的。

链接地址: http://www.djcxy.com/p/40723.html

上一篇: Can not deduce superclass

下一篇: Handling a stream of events based on timing in rxjs