Hello Guys,
While trying to build VSHaskell with the recent GHC I found the
following problem. In Stable.c the stable_mutex is used for
synchronization but it is initialized only from initStablePtrTable.
The initStablePtrTable function is called only from hs_init but
according to the following comment:
// Nothing to do:
// the table will be allocated the first time makeStablePtr is
// called, and we want the table to persist through multiple inits.
//
// Also, getStablePtr is now called from __attribute__((constructor))
// functions, so initialising things here wouldn't work anyway.
it might be too late. In this case the CRITICAL_SECTION will not be
initialized at the right time. The consequence is that the whole
program crashes. In order to fix that I have added a call to
initStablePtrTable to each function that requires locking. The actions
in initStablePtrTable are executed only the first time when it is
called. Since I am using SPT_size as a flag it isn't safe to call
it for a first time from two concurrent threads. As long as it is
executed from hs_init or from any __attribute__((constructor))
function, I think it is safe.
This fixes the problem but after that the RTS blocks with waitCondition
at line 401 in Capability.c. The trace messages are with +RTS -Ds are:
ACQUIRE_LOCK(0x64FDC130) Stable.c 248
RELEASE_LOCK(0x64FDC130) Stable.c 251
ACQUIRE_LOCK(0x64FDCE50) Schedule.c 2689
sched (task 00000EF8): allocated 1 capabilities
RELEASE_LOCK(0x64FDCE50) Schedule.c 2722
ACQUIRE_LOCK(0x64FDCDF0) Storage.c 132
RELEASE_LOCK(0x64FDCDF0) Storage.c 256
ACQUIRE_LOCK(0x64FDCE50) RtsAPI.c 560
sched (task 00000EF8): new task (taskCount: 1)
RELEASE_LOCK(0x64FDCE50) RtsAPI.c 562
ACQUIRE_LOCK(0x64FDD128) Capability.c 387
sched (task 00000EF8): returning; I want capability 0
RELEASE_LOCK(0x64FDD128) Capability.c 395
sched (task 00000EF8): returning; got capability 0
ACQUIRE_LOCK(0x64FDCE50) Schedule.c 2425
RELEASE_LOCK(0x64FDCE50) Schedule.c 2429
sched (task 00000EF8): created thread 1, stack size = f2 words
sched (task 00000EF8): new bound thread (1)
sched (task 00000EF8): ### NEW SCHEDULER LOOP (task: 01D8FD50, cap: 64FDD040)
sched (task 00000EF8): ### Running thread 1 in bound thread
sched (task 00000EF8): -->> running thread 1 ThreadRunGHC ...
sched (task 00000EF8): thread 1 did a safe foreign call
ACQUIRE_LOCK(0x64FDD128) Schedule.c 2212
sched (task 00000EF8): starting new worker on capability 0
ACQUIRE_LOCK(0x01D8FE10) Task.c 245
sched (task 00000EF8): new worker task (taskCount: 2)
RELEASE_LOCK(0x01D8FE10) Task.c 265
RELEASE_LOCK(0x64FDD128) Schedule.c 2218
sched (task 00000EF8): thread 1: leaving RTS
ACQUIRE_LOCK(0x64FDD128) Capability.c 387
sched (task 00000EF8): returning; I want capability 0
RELEASE_LOCK(0x64FDD128) Capability.c 398
ACQUIRE_LOCK(0x01D8FD70) Capability.c 401
RELEASE_LOCK(0x01D8FD70) win32/OSThreads.c 75
I also have added optional debug messages to ACQUIRE_LOCK/RELEASE_LOCK
for Windows like they have been added for Linux. The applied patch is attached.
Cheers,
Krasimir
New patches:
[support LOCK_DEBUG for Windows
[EMAIL PROTECTED] {
hunk ./ghc/includes/OSThreads.h 93
+
+#ifdef LOCK_DEBUG
+
+#define ACQUIRE_LOCK(mutex) \
+ debugBelch("ACQUIRE_LOCK(0x%p) %s %d\n", mutex,__FILE__,__LINE__); \
+ EnterCriticalSection(mutex)
+#define RELEASE_LOCK(mutex) \
+ debugBelch("RELEASE_LOCK(0x%p) %s %d\n", mutex,__FILE__,__LINE__); \
+ LeaveCriticalSection(mutex)
+#define ASSERT_LOCK_HELD(mutex) /* nothing */
+
+#else
+
hunk ./ghc/includes/OSThreads.h 113
+#endif
+
}
[The initStablePtrTable should be called before ACQUIRE_LOCK(&stable_mutex)
[EMAIL PROTECTED] {
hunk ./ghc/rts/Stable.c 142
- // Nothing to do:
- // the table will be allocated the first time makeStablePtr is
- // called, and we want the table to persist through multiple inits.
- //
- // Also, getStablePtr is now called from __attribute__((constructor))
- // functions, so initialising things here wouldn't work anyway.
+ if (SPT_size > 0)
+ return;
+
+ SPT_size = INIT_SPT_SIZE;
+ stable_ptr_table = stgMallocBytes(SPT_size * sizeof(snEntry),
+ "initStablePtrTable");
+
+ /* we don't use index 0 in the stable name table, because that
+ * would conflict with the hash table lookup operations which
+ * return NULL if an entry isn't found in the hash table.
+ */
+ initFreeList(stable_ptr_table+1,INIT_SPT_SIZE-1,NULL);
+ addrToStableHash = allocHashTable();
+
hunk ./ghc/rts/Stable.c 223
+
+ initStablePtrTable();
hunk ./ghc/rts/Stable.c 247
+ initStablePtrTable();
hunk ./ghc/rts/Stable.c 260
+ initStablePtrTable();
hunk ./ghc/rts/Stable.c 283
-
- if (SPT_size == 0) {
- // 1st time
- SPT_size = INIT_SPT_SIZE;
- stable_ptr_table = stgMallocBytes(SPT_size * sizeof(snEntry),
- "enlargeStablePtrTable");
-
- /* we don't use index 0 in the stable name table, because that
- * would conflict with the hash table lookup operations which
- * return NULL if an entry isn't found in the hash table.
- */
- initFreeList(stable_ptr_table+1,INIT_SPT_SIZE-1,NULL);
- addrToStableHash = allocHashTable();
- }
- else {
+
hunk ./ghc/rts/Stable.c 285
- SPT_size *= 2;
- stable_ptr_table =
- stgReallocBytes(stable_ptr_table,
+ SPT_size *= 2;
+ stable_ptr_table =
+ stgReallocBytes(stable_ptr_table,
hunk ./ghc/rts/Stable.c 291
- initFreeList(stable_ptr_table + old_SPT_size, old_SPT_size, NULL);
- }
+ initFreeList(stable_ptr_table + old_SPT_size, old_SPT_size, NULL);
}
Context:
[If we don't have libreadline then we need some dummy definition for complete*
functions.
[EMAIL PROTECTED]
[Bugfix in completion code for :set and :unset.
Lemmih <[EMAIL PROTECTED]>**20060210181319]
[Completion for :set, :unset and :undef.
Lemmih <[EMAIL PROTECTED]>**20060210171728]
[oops, forgot some more SMP->THREADED_RTS conversions
Simon Marlow <[EMAIL PROTECTED]>**20060210153236]
[fix test for REG_BaseReg (it's spelled REG_Base)
Simon Marlow <[EMAIL PROTECTED]>**20060210123552]
[Change CVS for _darcs in dirs to prune during make dist
Duncan Coutts <[EMAIL PROTECTED]>**20060209093204]
[fix for dirty_MUT_VAR: don't try to recordMutableCap in gen 0
Simon Marlow <[EMAIL PROTECTED]>**20060210120021]
[STM fix from Tim Harris
Simon Marlow <[EMAIL PROTECTED]>**20060210112111
Fixes assertion failures with STM and -debug. Tim says:
Sorry, it's a problem in how nested transactions are handled in
non-SMP builds. It'll bite when trying to commit a nested transaction
which has read from a TVar but not updated it.
The call to validate_and_acquire_ownership in
stmCommitNestedTransaction should be the same as that in
stmCommitNestedTransaction, i.e.:
result = validate_and_acquire_ownership(trec, (!use_read_phase), TRUE);
]
[improvement to the deadlock detection
Simon Marlow <[EMAIL PROTECTED]>*-20060209123056
When the RTS is idle, as detected by the timer signal, instead of
prodding capabilities from the signal handler (which is not guaranteed
to work - pthread_cond_signal() can't be called from signal handlers),
create a new thread to do it.
]
[Simplify the -B handling. The interface to the ghc library has changed
slightly.
Lemmih <[EMAIL PROTECTED]>**20060210094601]
[Fix desugaring of unboxed tuples
[EMAIL PROTECTED]
This patch is a slightly-unsatisfactory fix to desugaring unboxed
tuples; it fixes ds057 which has been failing for some time.
Unsatisfactory because rather ad hoc -- but that applies to lots
of the unboxed tuple stuff.
]
[x86_64: fix case of out-of-range operands to leaq
Simon Marlow <[EMAIL PROTECTED]>**20060209162247]
[Merge the smp and threaded RTS ways
Simon Marlow <[EMAIL PROTECTED]>**20060209154449
Now, the threaded RTS also includes SMP support. The -smp flag is a
synonym for -threaded. The performance implications of this are small
to negligible, and it results in a code cleanup and reduces the number
of combinations we have to test.
]
[change dirty_MUT_VAR() to use recordMutableCap()
Simon Marlow <[EMAIL PROTECTED]>**20060209150420
rather than recordMutableGen(), the former works better in SMP
]
[improvement to the deadlock detection
Simon Marlow <[EMAIL PROTECTED]>**20060209123056
When the RTS is idle, as detected by the timer signal, instead of
prodding capabilities from the signal handler (which is not guaranteed
to work - pthread_cond_signal() can't be called from signal handlers),
create a new thread to do it.
]
[Fix typo
[EMAIL PROTECTED]
[Fix instance rules for functional dependencies
[EMAIL PROTECTED]
GHC 6.4 implements a rather relaxed version of the Coverage Condition
which is actually too relaxed: the compiler can get into an infinite loop
as a result.
This commit fixes the problem (see Note [Coverage condition] in FunDeps.lhs)
and documents the change.
I also took the opportunity to add documentation about functional dependencies,
taken from the Hugs manual with kind permission of Mark Jones
]
[fix for the unregisterised way
Simon Marlow <[EMAIL PROTECTED]>**20060209105058
We always assign to BaseReg on return from resumeThread(), but in
cases where BaseReg is not an lvalue (eg. unreg) we need to disable
this assigment. See comments for more details.
]
[prof/smp combination probably doesn't work, disable it
Simon Marlow <[EMAIL PROTECTED]>**20060209104815]
[tiny panic msg fix
Simon Marlow <[EMAIL PROTECTED]>**20060209102540]
[Loosen the rules for instance declarations (Part 2)
[EMAIL PROTECTED]
Tidying up to Ross's patch, plus adding documenation for it.
]
[relaxed instance termination test
Ross Paterson <[EMAIL PROTECTED]>**20060206111651
With -fglasgow-exts but not -fallow-undecidable-instances, GHC 6.4
requires that instances be of the following form:
(1) each assertion in the context must constrain distinct variables
mentioned in the head, and
(2) at least one argument of the head must be a non-variable type.
This patch replaces these rules with the requirement that each assertion
in the context satisfy
(1) no variable has more occurrences in the assertion than in the head, and
(2) the assertion has fewer constructors and variables (taken together
and counting repetitions) than the head.
This allows all instances permitted by the old rule, plus such instances as
instance C a
instance Show (s a) => Show (Sized s a)
instance (Eq a, Show b) => C2 a b
instance C2 Int a => C3 Bool [a]
instance C2 Int a => C3 [a] b
instance C4 a a => C4 [a] [a]
but still ensures that under any substitution assertions in the context
will be smaller than the head, so context reduction must terminate.
This is probably the best we can do if we consider each instance in
isolation.
]
[Fix CPP failure by adding space before hASH_TBL_SIZE
[EMAIL PROTECTED]
[an LDV profiling fix (might just fix ASSERTIONs, I'm not sure)
Simon Marlow <[EMAIL PROTECTED]>**20060208170744]
[Do type refinement in TcIface
[EMAIL PROTECTED]
This commit fixes a bug in 6.4.1 and the HEAD. Consider this code,
recorded **in an interface file**
\(x::a) -> case y of
MkT -> case x of { True -> ... }
(where MkT forces a=Bool)
In the "case x" we need to know x's type, because we use that
to find which module to look for "True" in. x's type comes from
the envt, so we must refine the envt.
The alternative would be to record more info with an IfaceCase,
but that would change the interface file format.
(This stuff will go away when we have proper coercions.)
]
[Add mapOccEnv
[EMAIL PROTECTED]
[A little more debug printing
[EMAIL PROTECTED]
[Show types of case result when debug is on
[EMAIL PROTECTED]
[fix installation of binary dist when the PS docs aren't present
Simon Marlow <[EMAIL PROTECTED]>**20060208153259
Fixes #660
]
[fix a bug in closure_sizeW_()
Simon Marlow <[EMAIL PROTECTED]>**20060208145451]
[make the smp way RTS-only, normal libraries now work with -smp
Simon Marlow <[EMAIL PROTECTED]>**20060208143348
We had to bite the bullet here and add an extra word to every thunk,
to enable running ordinary libraries on SMP. Otherwise, we would have
needed to ship an extra set of libraries with GHC 6.6 in addition to
the two sets we already ship (normal + profiled), and all Cabal
packages would have to be compiled for SMP too. We decided it best
just to take the hit now, making SMP easily accessible to everyone in
GHC 6.6.
Incedentally, although this increases allocation by around 12% on
average, the performance hit is around 5%, and much less if your inner
loop doesn't use any laziness.
]
[add -dfaststring-stats to dump some stats about the FastString hash table
Simon Marlow <[EMAIL PROTECTED]>**20060208131018]
[fix a warning
Simon Marlow <[EMAIL PROTECTED]>**20060207132323]
[catch up with changes to Distribution.ParseUtils.ParseResult
Simon Marlow <[EMAIL PROTECTED]>**20060207111111]
[Wibble to type signature
[EMAIL PROTECTED]
[Empty forall should disable implicit quantification
[EMAIL PROTECTED]
[Remove unused constructor in SourceTypeCtxt
[EMAIL PROTECTED]
[Basic completion in GHCi
Simon Marlow <[EMAIL PROTECTED]>**20060206122654
This patch adds completion support to GHCi when readline is being
used. Completion of identifiers (in scope only, but including
qualified identifiers) in expressions is provided. Also, completion
of commands (:cmd), and special completion for certain commands
(eg. module names for the :module command) are also provided.
]
[Improve error report for pattern guards
[EMAIL PROTECTED]
[Add bang patterns
[EMAIL PROTECTED]
This commit adds bang-patterns,
enabled by -fglasgow-exts or -fbang-patterns
diabled by -fno-bang-patterns
The idea is described here
http://haskell.galois.com/cgi-bin/haskell-prime/trac.cgi/wiki/BangPatterns
]
[Add Bag.anyBag (analogous to List.any)
[EMAIL PROTECTED]
[Deal correctly with lazy patterns and GADTs
[EMAIL PROTECTED]
[Record the type in TuplePat (necessary for GADTs)
[EMAIL PROTECTED]
We must record the type of a TuplePat after typechecking, just like a
ConPatOut,
so that desugaring works correctly for GADTs. See comments with the declaration
of HsPat.TuplePat, and test gadt15
]
[Improve error reporting in Core Lint
[EMAIL PROTECTED]
[don't clean ghc-inplace when cleaning stages other than 1
Simon Marlow <[EMAIL PROTECTED]>**20060202124359]
[Improve error reporting in typechecker
[EMAIL PROTECTED]
[Trim imports
[EMAIL PROTECTED]
[Yet another fix to an old hi-boot-6 file
[EMAIL PROTECTED]
[Kinding wibble in TH brackets
[EMAIL PROTECTED]
[Use extraGHCiLibraries (if supplied) in GHCi linker rather than extraLibraries
Duncan Coutts <[EMAIL PROTECTED]>**20051207105654
Also extend the parser.
]
[combine libraries/.darcs-boring and .darcs-boring
Simon Marlow <[EMAIL PROTECTED]>**20060131161530]
[Fix long-standing bug in CPR analysis
[EMAIL PROTECTED]
MERGE TO STABLE
For a long time (2002!) the CPR analysis done by
dmdAnalTopRhs has been bogus. In particular, it's possible
for a newtype constructor to look CPR-ish when it simply isn't.
This fixes it. Test is stranal/newtype
]
[More hi-boot-6 updates
[EMAIL PROTECTED]
[Fix TcUnify.subFunTys in AppTy case
[EMAIL PROTECTED]
subFunTys wasn't dealing correctly with the case where the type
to be split was of form (a ty1), where a is a type variable.
This shows up when compiling
Control.Arrow.Transformer.Stream
in package arrows.
This commit fixes it.
]
[Error message wibble
[EMAIL PROTECTED]
[Add mkHsCoerce to avoid junk in typechecked code
[EMAIL PROTECTED]
Avoiding identity coercions is a Good Thing generally, but
it turns out that the desugarer has trouble recognising
'otherwise' and 'True' guards if they are wrapped in an
identity coercion; and that leads to bogus overlap warnings.
]
[Improve error messsage when argument count varies
[EMAIL PROTECTED]
[fix bug #664 in printSample()
Simon Marlow <[EMAIL PROTECTED]>**20060130115301
printSample() was attempting to round the fractional part of the time,
but not propagated to the non-fractional part. It's probably better not
to attempt to round the time at all.
]
[Fix hi-boot file for earlier versions of GHC
[EMAIL PROTECTED]
[Fix typo in boxy matching
[EMAIL PROTECTED]
[fix one case where -q wasn't honoured
Simon Marlow <[EMAIL PROTECTED]>**20060127104715]
[Check for GMP.framework on all Darwin platforms, not just PPC
[EMAIL PROTECTED]
[Simon's big boxy-type commit
[EMAIL PROTECTED]
This very large commit adds impredicativity to GHC, plus
numerous other small things.
*** WARNING: I have compiled all the libraries, and
*** a stage-2 compiler, and everything seems
*** fine. But don't grab this patch if you
*** can't tolerate a hiccup if something is
*** broken.
The big picture is this:
a) GHC handles impredicative polymorphism, as described in the
"Boxy types: type inference for higher-rank types and
impredicativity" paper
b) GHC handles GADTs in the new simplified (and very sligtly less
epxrssive) way described in the
"Simple unification-based type inference for GADTs" paper
But there are lots of smaller changes, and since it was pre-Darcs
they are not individually recorded.
Some things to watch out for:
c) The story on lexically-scoped type variables has changed, as per
my email. I append the story below for completeness, but I
am still not happy with it, and it may change again. In particular,
the new story does not allow a pattern-bound scoped type variable
to be wobbly, so (\(x::[a]) -> ...) is usually rejected. This is
more restrictive than before, and we might loosen up again.
d) A consequence of adding impredicativity is that GHC is a bit less
gung ho about converting automatically between
(ty1 -> forall a. ty2) and (forall a. ty1 -> ty2)
In particular, you may need to eta-expand some functions to make
typechecking work again.
Furthermore, functions are now invariant in their argument types,
rather than being contravariant. Again, the main consequence is
that you may occasionally need to eta-expand function arguments when
using higher-rank polymorphism.
Please test, and let me know of any hiccups
Scoped type variables in GHC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
January 2006
0) Terminology.
A *pattern binding* is of the form
pat = rhs
A *function binding* is of the form
f pat1 .. patn = rhs
A binding of the formm
var = rhs
is treated as a (degenerate) *function binding*.
A *declaration type signature* is a separate type signature for a
let-bound or where-bound variable:
f :: Int -> Int
A *pattern type signature* is a signature in a pattern:
\(x::a) -> x
f (x::a) = x
A *result type signature* is a signature on the result of a
function definition:
f :: forall a. [a] -> a
head (x:xs) :: a = x
The form
x :: a = rhs
is treated as a (degnerate) function binding with a result
type signature, not as a pattern binding.
1) The main invariants:
A) A lexically-scoped type variable always names a (rigid)
type variable (not an arbitrary type). THIS IS A CHANGE.
Previously, a scoped type variable named an arbitrary *type*.
B) A type signature always describes a rigid type (since
its free (scoped) type variables name rigid type variables).
This is also a change, a consequence of (A).
C) Distinct lexically-scoped type variables name distinct
rigid type variables. This choice is open;
2) Scoping
2(a) If a declaration type signature has an explicit forall, those type
variables are brought into scope in the right hand side of the
corresponding binding (plus, for function bindings, the patterns on
the LHS).
f :: forall a. a -> [a]
f (x::a) = [x :: a, x]
Both occurences of 'a' in the second line are bound by
the 'forall a' in the first line
A declaration type signature *without* an explicit top-level forall
is implicitly quantified over all the type variables that are
mentioned in the type but not already in scope. GHC's current
rule is that this implicit quantification does *not* bring into scope
any new scoped type variables.
f :: a -> a
f x = ...('a' is not in scope here)...
This gives compatibility with Haskell 98
2(b) A pattern type signature implicitly brings into scope any type
variables mentioned in the type that are not already into scope.
These are called *pattern-bound type variables*.
g :: a -> a -> [a]
g (x::a) (y::a) = [y :: a, x]
The pattern type signature (x::a) brings 'a' into scope.
The 'a' in the pattern (y::a) is bound, as is the occurrence on
the RHS.
A pattern type siganture is the only way you can bring existentials
into scope.
data T where
MkT :: forall a. a -> (a->Int) -> T
f x = case x of
MkT (x::a) f -> f (x::a)
2a) QUESTION
class C a where
op :: forall b. b->a->a
instance C (T p q) where
op = <rhs>
Clearly p,q are in scope in <rhs>, but is 'b'? Not at the moment.
Nor can you add a type signature for op in the instance decl.
You'd have to say this:
instance C (T p q) where
op = let op' :: forall b. ...
op' = <rhs>
in op'
3) A pattern-bound type variable is allowed only if the pattern's
expected type is rigid. Otherwise we don't know exactly *which*
skolem the scoped type variable should be bound to, and that means
we can't do GADT refinement. This is invariant (A), and it is a
big change from the current situation.
f (x::a) = x -- NO; pattern type is wobbly
g1 :: b -> b
g1 (x::b) = x -- YES, because the pattern type is rigid
g2 :: b -> b
g2 (x::c) = x -- YES, same reason
h :: forall b. b -> b
h (x::b) = x -- YES, but the inner b is bound
k :: forall b. b -> b
k (x::c) = x -- NO, it can't be both b and c
3a) You cannot give different names for the same type variable in the same
scope
(Invariant (C)):
f1 :: p -> p -> p -- NO; because 'a' and 'b' would be
f1 (x::a) (y::b) = (x::a) -- bound to the same type variable
f2 :: p -> p -> p -- OK; 'a' is bound to the type variable
f2 (x::a) (y::a) = (x::a) -- over which f2 is quantified
-- NB: 'p' is not lexically scoped
f3 :: forall p. p -> p -> p -- NO: 'p' is now scoped, and is bound
to
f3 (x::a) (y::a) = (x::a) -- to the same type varialble as 'a'
f4 :: forall p. p -> p -> p -- OK: 'p' is now scoped, and its
occurences
f4 (x::p) (y::p) = (x::p) -- in the patterns are bound by the
forall
3b) You can give a different name to the same type variable in different
disjoint scopes, just as you can (if you want) give diferent names to
the same value parameter
g :: a -> Bool -> Maybe a
g (x::p) True = Just x :: Maybe p
g (y::q) False = Nothing :: Maybe q
3c) Scoped type variables respect alpha renaming. For example,
function f2 from (3a) above could also be written:
f2' :: p -> p -> p
f2' (x::b) (y::b) = x::b
where the scoped type variable is called 'b' instead of 'a'.
4) Result type signatures obey the same rules as pattern types signatures.
In particular, they can bind a type variable only if the result type is
rigid
f x :: a = x -- NO
g :: b -> b
g x :: b = x -- YES; binds b in rhs
5) A *pattern type signature* in a *pattern binding* cannot bind a
scoped type variable
(x::a, y) = ... -- Legal only if 'a' is already in scope
Reason: in type checking, the "expected type" of the LHS pattern is
always wobbly, so we can't bind a rigid type variable. (The exception
would be for an existential type variable, but existentials are not
allowed in pattern bindings either.)
Even this is illegal
f :: forall a. a -> a
f x = let ((y::b)::a, z) = ...
in
Here it looks as if 'b' might get a rigid binding; but you can't bind
it to the same skolem as a.
6) Explicitly-forall'd type variables in the *declaration type signature(s)*
for a *pattern binding* do not scope AT ALL.
x :: forall a. a->a -- NO; the forall a does
Just (x::a->a) = Just id -- not scope at all
y :: forall a. a->a
Just y = Just (id :: a->a) -- NO; same reason
THIS IS A CHANGE, but one I bet that very few people will notice.
Here's why:
strange :: forall b. (b->b,b->b)
strange = (id,id)
x1 :: forall a. a->a
y1 :: forall b. b->b
(x1,y1) = strange
This is legal Haskell 98 (modulo the forall). If both 'a' and 'b'
both scoped over the RHS, they'd get unified and so cannot stand
for distinct type variables. One could *imagine* allowing this:
x2 :: forall a. a->a
y2 :: forall a. a->a
(x2,y2) = strange
using the very same type variable 'a' in both signatures, so that
a single 'a' scopes over the RHS. That seems defensible, but odd,
because though there are two type signatures, they introduce just
*one* scoped type variable, a.
7) Possible extension. We might consider allowing
\(x :: [ _ ]) -> <expr>
where "_" is a wild card, to mean "x has type list of something", without
naming the something.
]
[add double colon and double arrow symbols (-fglasgow-exts)
Simon Marlow <[EMAIL PROTECTED]>**20060125135501]
[Fix conDeclFVs for GADTs, to fix bogus unused-import warning
[EMAIL PROTECTED]
[make the par# primop actually do something
Simon Marlow <[EMAIL PROTECTED]>**20060124162521]
[Update Cachegrind support for changes to the Valgrind CLI
Simon Marlow <[EMAIL PROTECTED]>**20060124154732]
[send usage info to stdout, not stderr
Simon Marlow <[EMAIL PROTECTED]>**20060124145551]
[primop-docs
Dinko Tenev <[EMAIL PROTECTED]>**20060122222446]
[remove old CVS stuff, replace with darcs
Simon Marlow <[EMAIL PROTECTED]>**20060120151322]
[implement clean/dirty TSOs
Simon Marlow <[EMAIL PROTECTED]>**20060123164930
Along the lines of the clean/dirty arrays and IORefs implemented
recently, now threads are marked clean or dirty depending on whether
they need to be scanned during a minor GC or not. This should speed
up GC when there are lots of threads, especially if most of them are
idle.
]
[Better error message for Template Haskell pattern brackets
[EMAIL PROTECTED]
[remove old comment
Simon Marlow <[EMAIL PROTECTED]>**20060123140530]
[Fix for feature request #655 (Loading the GHC library from GHCi.)
Lemmih <[EMAIL PROTECTED]>**20060123110625
Moved the utility functions out of hschooks, avoided
linking the GHC library with hschooks.o and
added a couple of symbols to the linkers export list.
]
[Make hsc2hs emit the full path name in {-# LINE #-} pagmas.
Duncan Coutts <[EMAIL PROTECTED]>**20060122011831
For one thing this is the right thing to do anyway, it's what other tools do.
Secondly it allows haddock to produce accurate source code links.
]
[MFLAGS += -f Makefile
Simon Marlow <[EMAIL PROTECTED]>**20060123094837
merged from CVS, because Tailor isn't merging the libraries subdir
]
[undo accidental commit of snapshot version
Simon Marlow <[EMAIL PROTECTED]>**20060122175817]
[TAG final switch to darcs, this repo is now live
Simon Marlow <[EMAIL PROTECTED]>**20060120134630]
Patch bundle hash:
2d7f27c5f7c2ce16ec19dacc50acf2a7243ecee7
_______________________________________________
Cvs-ghc mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/cvs-ghc