bogus "syntactically distinct contexts" error
{-# LANGUAGE TypeOperators, FlexibleContexts
, MultiParamTypeClasses, FunctionalDependencies
, TypeFamilies
-- , ScopedTypeVariables
#-}
-- The ScopedTypeVariables is there just as a bug work-around. Without:
--
-- Mutually dependent functions have syntactically distinct contexts
-- When matching the contexts of the signatures for
-- dZero :: forall b a s.
-- (AdditiveGroup b, HasBasis a s, HasTrie (Basis a)) =>
-- a :> b
-- pureD :: forall b a s.
-- (AdditiveGroup b, HasBasis a s, HasTrie (Basis a)) =>
-- b -> a :> b
-- The signature contexts in a mutually recursive group should all be identical
-- When generalising the type(s) for dZero, pureD
--
-- This bug was introduced between ghc 6.9.20080622 and 6.10.0.20081007.
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
import Control.Applicative
class AdditiveGroup v where
zeroV :: v
(^+^) :: v -> v -> v
negateV :: v -> v
class AdditiveGroup v => VectorSpace v s | v -> s where
(*^) :: s -> v -> v
-- | Mapping from all elements of @a@ to the results of some function
class HasTrie a where
data (:->:) a :: * -> *
instance HasTrie a => Functor ((:->:) a)
instance HasTrie a => Applicative ((:->:) a)
class VectorSpace v s => HasBasis v s where
type Basis v :: *
-- | Linear map, represented a as a memo function from basis to values.
type u :-* v = Basis u :->: v
data a :> b = D { powVal :: b, derivative :: a :-* (a :> b) }
dZero :: (AdditiveGroup b, HasBasis a s, HasTrie (Basis a)) => a:>b
dZero = pureD zeroV
pureD :: (AdditiveGroup b, HasBasis a s, HasTrie (Basis a)) => b -> a:>b
pureD b = b `D` pure dZero
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.11 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | conal |
| Operating system | |
| Architecture |