RE: select() failure

2002-08-28 Thread Simon Marlow


 I have a program that is suffering a select() failure.  It prints:
 
 9
 select: Bad file descriptor
 Fed: fatal error: select failed
 
 From looking at some RTS sources, the 9 apparently represents 
 errno EBADF 
 (bad file descriptor).  Does that mean that my program is 
 somehow closing
 one or more file descriptors between when the select() starts 
 and when it
 finishes?

This can arise if you do one of the operations threadWaitRead or
threadWaitWrite on a file descriptor that is closed.  Sigbjorn recently
modified the select() code so that it wouldn't fail in such an ugly way;
now it just wakes up all the threads that were doing select() in the
hope that the one with a bad file descriptor in its hands will discover
it some other way (the real problem is that select() doesn't tell us
which file desriptors were bad/closed when it fails).

Anyway, you should avoid this scenario if at all possible, since the
current fall-back method of waking up all the threads could be quite
expensive.

 Unfortunately, select() (and hence the GHC RTS) doesn't 
 identify the bad
 descriptor(s).  Here's where I suspect my program may be 
 going awry.  The
 main process creates a pipe.  The process then forks.  The 
 parent closes
 the pipe's read descriptor immediately.  The child soon goes 
 to read from
 the pipe, using threadWaitRead followed by fdRead.  The child process
 suffers the select failure shown above.

So.. I take it the child shouldn't really be reading from a closed file
descriptor?

 By the way, why shouldn't such a fatal error in the RTS raise an
 exception that I can catch in my program?  I could then 
 determine at least 
 which thread in which process suffered the error.

A 'fatal error' in the RTS usually means some kind of internal error
which it isn't possible to recover from.  Hence the term fatal :-)
I've changed the wording in my copy to make it more clear that these
errors are internal and normally indicate a bug.

Cheers,
Simon
___
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs



RE: bug with rank n polymorphism in classes

2002-08-28 Thread Simon Peyton-Jones

Please say which version of GHC you are using.

This program works fine with GHC 5.02.2

Simon

| -Original Message-
| From: Hal Daume III [mailto:[EMAIL PROTECTED]] 
| Sent: 22 August 2002 20:47
| To: [EMAIL PROTECTED]
| Subject: bug with rank n polymorphism in classes
| 
| 
| consider:
| 
| module Foo where
| 
| class Foo p where
| foo :: p - (forall q . Foo q = q - a) - a
| 
| instance Foo Int where
| 
| 
| if you load this in to ghci, it complains:
| 
| /home/hdaume/projects/NLP/Foo.hs:6:
| Ambiguous type variable(s) `q' in the constraint `Foo q'
| arising from a function with an overloaded argument type 
| at /home/hdaume/projects/NLP/Foo.hs:6
|   Expected type: Int - (forall q1. (Foo q1) = q1 - a) - a
|   Inferred type: Int - (q - a) - a
| In the application `GHC.Err.noMethodBindingError 
| /home/hdaume/projects/NLP/Foo.hs:6|Foo.foo#'
| 
| which is a reasonable complaint, but is emiited in a rather 
| bizzare way.
| 
| --
| Hal Daume III
| 
|  Computer science is no more about computers| [EMAIL PROTECTED]
|   than astronomy is about telescopes. -Dijkstra | www.isi.edu/~hdaume
| 
| ___
| Glasgow-haskell-bugs mailing list 
| [EMAIL PROTECTED] 
| http://www.haskell.org/mailman/listinfo/glasgow-| haskell-bugs
| 
___
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs



Posix.executeFile having problems with unevaluated argumnets

2002-08-28 Thread George Russell

Sorry, I haven't got time to narrow this down to a test case, but here are
what I hope are the key factors:

(1) We start up applications in a child process (forked with Posix.forkProcess)
by calling Posix.executeFile, wrapped in an Exception.catch handler (to detect
errors).
(2) Both the third (arguments) and fourth argument (environment) of Posix.executeFile
are non-empty.  The environment at least requires some computation, being obtained
by prepending another setting to the result of Posix.getEnvironment.
(3) The second argument of Posix.executeFile is True.
(4) The executable of the whole compiled Haskell program is pretty big (13.6MB).
This may be relevant because the problem I am about to describe developed quite
suddenly yesterday afternoon, after I'd made some small changes to completely 
unrelated
areas of the program, and the only explanation I can think of is that in some way
the slightly increased size of the executable triggered the problem.

What happens is that the arguments and environment are somehow garbled.  This is 
surprising,
but I have good evidence for it, obtained by putting a small proxy binary between
Haskell and the environment.  For example it does

echo indefectible $* | mail ger
[the real application] $*

and although the argument should actually be -pipe, what I get mailed is my current 
PATH, or
something of the sort.  Yes I know it's hard to believe.

Fortunately I have discovered a fix.  If I insert the commands
deepSeq (args parms) done
deepSeq (env parms) done
just before doing executeFile (actually they are also outside the exception handler)
everything works swimmingly.  deepSeq is just that helpful utility which forces full
evaluation of its argument, and so this forces full evaluation of the arguments and
parameters.

As I have a fix, and not much spare time, I'm afraid I can't do much to fix this.
But could someone eyeball the code for Posix.executeFile and see if there's something
obviously wrong?
___
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs



RE: select() failure

2002-08-28 Thread Dean Herington

On Wed, 28 Aug 2002, Simon Marlow wrote:

  I have a program that is suffering a select() failure.  It prints:
  
  9
  select: Bad file descriptor
  Fed: fatal error: select failed
  
  From looking at some RTS sources, the 9 apparently represents 
  errno EBADF 
  (bad file descriptor).  Does that mean that my program is 
  somehow closing
  one or more file descriptors between when the select() starts 
  and when it
  finishes?
 
 This can arise if you do one of the operations threadWaitRead or
 threadWaitWrite on a file descriptor that is closed.  Sigbjorn recently
 modified the select() code so that it wouldn't fail in such an ugly way;
 now it just wakes up all the threads that were doing select() in the
 hope that the one with a bad file descriptor in its hands will discover
 it some other way (the real problem is that select() doesn't tell us
 which file desriptors were bad/closed when it fails).
 
 Anyway, you should avoid this scenario if at all possible, since the
 current fall-back method of waking up all the threads could be quite
 expensive.

I use `threadWaitRead` in one place and `threadWaitWrite` nowhere.  I
added a check before the use of `threadWaitRead` that I've not closed the
file descriptor.  The check never detects a closed file descriptor, yet I
still get the select() failure.

I'm assuming that the RTS's select() is done on the sets of file
descriptors involved in current `threadWaitRead` and `threadWaitWrite`
calls.  Is that true?  Are there other uses of select() in the RTS?

  Unfortunately, select() (and hence the GHC RTS) doesn't 
  identify the bad
  descriptor(s).  Here's where I suspect my program may be 
  going awry.  The
  main process creates a pipe.  The process then forks.  The 
  parent closes
  the pipe's read descriptor immediately.  The child soon goes 
  to read from
  the pipe, using threadWaitRead followed by fdRead.  The child process
  suffers the select failure shown above.
 
 So.. I take it the child shouldn't really be reading from a closed file
 descriptor?

The file descriptor is the read end of a pipe used to send data from the
parent to the child.  The parent closes it because it will never use it,
but only after the parent forks.  So the child's copy of the file
descriptor should still be open, n'est-ce pas?

  By the way, why shouldn't such a fatal error in the RTS raise an
  exception that I can catch in my program?  I could then 
  determine at least 
  which thread in which process suffered the error.
 
 A 'fatal error' in the RTS usually means some kind of internal error
 which it isn't possible to recover from.  Hence the term fatal :-)
 I've changed the wording in my copy to make it more clear that these
 errors are internal and normally indicate a bug.

Is recovering from this error really not possible, as opposed to not
likely to be useful?

Dean

___
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs



GpH Mosix

2002-08-28 Thread Phil Trinder

Paul,

The GdH implementation is currently used here, and is basically in beta-release 
form. If you would use it we could wrap up a and X86/Linux version for you.

The GUM implementation of GpH and GdH uses very simple communication (mainly 
point to point, with a single barrier synchronisation, and the communication is 
restricted to just 3 C modules. As a result it can be readily ported to new 
communications libraries, e.g. MPI and CMMP (bespoke CM5 library) versions 
exist.

 Then what will Mosix provide when you can have
 a PVM cluster without Mosix running the same thing?

Don't know a lot about Mosix, but if the PVM calls in the 3 GUM communications 
modules can be replaced with Mosix shared-memory routines that would give a low 
effort port of GUM to a Mosix cluster. I'd expect Mosix communication to be 
*much* faster than PVM: it's so generic that it absorbs a lot of time, e.g. 
probing for a message takes 2000 machine cycles.

For small numers of processors a higher-performance implementation could be 
constructed by adapting the runtime system to effectively use the shared 
memory, but IIRC Simon Marlowe found there were problems with memory contention 
with more processors.

Phil

On Tue, 20 Aug 2002 
21:17:28 +0800 [EMAIL PROTECTED] wrote:

 Speaking of GpH, I wonder how is GdH coming along? It seems
 that the installation instruction on http://www.cee.hw.ac.uk/~dsg/gdh/
 is still incomplete...
 
 As far as I know, Mosix has nothing to do with PVM, so am I
 right to say that GpH still needs PVM even you use it on a
 Mosix cluster? Then what will Mosix provide when you can have
 a PVM cluster without Mosix running the same thing?
 
 Regards,
 .paul.
 
 On Tue, Aug 20, 2002 at 12:09:28PM +0100, Phil Trinder wrote:
  Murray,
  
  There are several parallel Haskell implementations: a survey of them has just 
  appeared in Journal of Func. Prog Vols 45 (July  Sept 2002). Implementations 
  are available for
  o Eden http://www.mathematik.uni-marburg.de/inf/eden/
  o GpH  http://www.cee.hw.ac.uk/~dsg/gph/
  
  My group works on Glasgow parallel Haskell (GpH) which extends Haskell 98 with 
  a parallel composition combinator. As Simon said the main implemntation,
  GUM, buys portability using the relatively slow PVM communications library. 
  This doesn't matter so much on distributed memory machines, and we've recently 
  achieved some quite respectable results SunServer shared-memory machines.
  
  Simon Marlowe developed an alternative SMP implementation of GpH a couple of 
  years ago that may be more suitable for a Mosix platform, but I'm not sure of 
  the status of that implementation now.
  
  Phil
  
  On Mon, 19 Aug 2002 18:04:44 +0100 Simon Peyton-Jones [EMAIL PROTECTED] 
  wrote:
  
   Hi Murray
   
   I'm catching up with my email backlog, but I didn't see a reply to your
   message, so I thought I'd reply.  The parallel-Haskell crew are at
 http://www.cee.hw.ac.uk/~dsg/gph/
   There's a mailing list that I'm ccing.
   
   GHC can be built to run on a shared-memory multiprocessor, but we have
   not built and tested that for some time.  
  
  Untrue - both Eden and GpH are currently used on SunServer SMPs.
  
   GPH is aimed more at
   distributed-memory machines, and has quite a bit more code layered on
   top of GHC.  Details on the GPH page above.  
   
   Let me know if I can help.  It'd be great to get some more
   parallel-Haskell stuff going.
   
   Simon
   
   | A group of us at Brooklyn College (City University of New 
   | York) are in the latter stages of setting up a Mosix cluster 
   | that we would like to use for research on, among other 
   | things, parallel execution of Haskell code and run-time 
   | optimization of both automatic and programmed parallelization.
   | 
   | I would greatly appreciate hearing from anyone who can 
   | provide advice on 
   | an appropriate bibliography on the language implementation and past 
   | work in this area (other than the code in the Haskell compilers and 
   | libraries, of course), approaches, ongoing work, etc. 
   | 
   | Also, I would be most interested in hearing from anyone 
   | interested in joining our effort (no problems with remote 
   | access to the cluster by way of SSH), or making arrangements 
   | for cooperation in research in this area, although, of 
   | course, access to our equipment will be subject to approval 
   | from higher authorities (however, note that I really don't 
   | expect difficulty here, since our administration has already 
   | shown considerable interest in supporting the project).
   | 
   | Replies to the list will be read, but those who wish may mail 
   | me directly at [EMAIL PROTECTED] 
   | 
   | Thanks in advance for any replies. 
   | 
   | Murray Gross
   | Adj. Lecturer, Brooklyn College, 
   | City University of New York 
   | 
   | 
   | 
   | ___
   | Haskell mailing list
   | [EMAIL PROTECTED] 

Re: A: Evaluation order, ghc versus hugs, lazy vs. strict

2002-08-28 Thread Phil Trinder

Dear All,

Hal's comments on the use of Evaluation Strategies for controlling 
strictness are substantially right, and they are used this way in Eden, a 
parallel Haskell. In Glasgow parallel Haskell(GpH) we use them to control 
parallel evaluation as well. The key reference is 
  Algorithm + Strategy = Parallelism, Journal of Functional Programming, 
  8(1):23--60, January 1998.
  http://www.cee.hw.ac.uk/~dsg/gph/papers/

Highlights are as follows. There are three basic strategies: 

r0, rwhnf, rnf :: Strategy a
r0 - does no evaluation, 
rwhnf - reduces it's argument to Weak Head Normal Form (WHNF). Hal defines this 
  as stratWHNF), and 
rnf - reduces it's argument to normal form (i.e. containing no redexes). It's 
  defined in a class similar to the Eval class

Strategies can be composed, e.g. seqList applies a strategy to every element of 
a list:

seqList :: Strategy a - Strategy [a]
seqList s [] = ()
seqList s (x:xs) = s x 'seq' (seqList s xs)

so

seqList r0 :: Stratgy [a]- evaluates just the spine of a list
seqList rwnf :: Strategy [a] - evaluates every element to WHNF
seqList (seqList r0) :: Strategy [[a]]  
 - evaluates just spines of every sublist in a list 
   of lists

Analogous parallel strategies, like parList, also exist.

The Strategies.lhs module is distributed with GHC (since version 0.29), so 
simply 'import Strategies' if you want to play.

HTH

Phil
On Fri, 23 Aug 2002 05:10:05 -0700 (PDT) Hal Daume III [EMAIL PROTECTED] wrote:

 I think there's more to strategies than this.  They are not necessarily
 related to parallel programming and can be used for tuning (in the seq
 sense) sequential (perhaps non-parallel would be a better
 word) programs.
 
 The type of strategies is:
 
   type Strategy a = a - ()
 
 for example, a strategy which reduces its argument to weak head normal
 form could be given by:
 
   stratWHNF x = x `seq` ()
 
 We define a funciton 'using' which uses strategies to do a computation:
 
   v `using` s = s x `seq` x
 
 These are used in parallel programming something like:
 
   fib 0 = 1
   fib 1 = 1
   fib n = a + b `using` strategy
 where a = fib (n-1)
   b = fib (n-2)
   strategy result = a `par` b `par` result
 
 This clearly separates the computation a+b from the way it is evaluated
 a in parallel to b in parallel to the result (i.e., a+b).
 
 But this can of course be used for sequential programming, too, simply by
 using seq instead of par in the above example.  This enables you to write
 clean code (your functions stay the same, except they are appended with
 `using` strategy), but you can control more precisely when things get
 reduced.
 
  - Hal
 
 --
 Hal Daume III
 
  Computer science is no more about computers| [EMAIL PROTECTED]
   than astronomy is about telescopes. -Dijkstra | www.isi.edu/~hdaume
 
 On 23 Aug 2002, Ketil Z. Malde wrote:
 
  Jan Kybic [EMAIL PROTECTED] writes:
  
   What are GUM and Strategies? Could you provide any links?
  
http://www.cee.hw.ac.uk/~dsg/gph/docs/Gentle-GPH/sec-gph.html
  
  GUM is an implementation of GPH (a parallel Haskell) that
  runs on top of PVM.
  
  Strategies are about making sure parallel threads actually do the work
  they're intended to before returning control to the main thread; in
  other words, ensuring sufficient strictness.  Or something like that.
  
  Grain of salt as applicable, I'm not using any of this yet.
  
  -kzm
  -- 
  If I haven't seen further, it is by standing in the footprints of giants
  ___
  Haskell mailing list
  [EMAIL PROTECTED]
  http://www.haskell.org/mailman/listinfo/haskell
  
 
 ___
 Haskell mailing list
 [EMAIL PROTECTED]
 http://www.haskell.org/mailman/listinfo/haskell

--
Phil Trinder
Department of Computing and Electrical Engineering
Heriot Watt University
Riccarton
Edinburgh, EH14 4AS

E-mail: [EMAIL PROTECTED]
Teleph: +44 (0)131 451 3435
Depart: +44 (0)131 451 3328
Fasmly: +44 (0)131 451 3327
Intrnt: http://www.cee.hw.ac.uk/~trinder

___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



RE: ambiguous type variables in existential classes

2002-08-28 Thread Simon Peyton-Jones

Hal

I don't quite understand the intuitions behind your program, but the
bug is easy enough:

| instance (Eq e, Foo p) = Foo (Wrap p) where
|   foo (Bar p) e q = foo p e q

This instance declaration is guaranteed to give problems if it is
ever used, and GHC should probably bleat about it.  Suppose 
you have the constraint 

Foo (Wrap T)

where T is some type.  Using the instance declaration we can simplify
this to the constraints

Eq e
Foo T

where e is a fresh type variable.  But we are never going to learn any
thing more about 'e', and so it is correctly reported as ambiguous.
It's
like writing

reverse :: Eq x = [a] - [a]

Any call to this 'reverse' will give a constraint (Eq x) that is
ambiguous.


Really, GHC should reject the instance declaration.

Simon
___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



RE: ugliness with state parameter in ST stuff

2002-08-28 Thread Simon Peyton-Jones

I don't know what you are trying to do, but I do know why your program
is rejected. 

The *whole point* of a value of type (STArray s Int Int) is that it can
only
be read by a state thread with the same type parameter 's' as the array.
Given your decls

 class Foo a where
 foo :: a - IO Int

 data Bar s = Bar (STArray s Int Int)
 
 instance Foo (Bar s) where ...

it is absolutely right that you are going to fail.   To implement the
instance decl, you need to make

foo :: forall s. Bar s - IO Int

But you can read an STArray parameterised by an *arbitrary* state type s
using the IO monad!  Of course not!  There is even a theorem in 'State
in Haskell'
that makes just this point: separate state threads really are separate,
and
you can't read a reference from one in another.

No, no, no!

Simon

| -Original Message-
| From: Hal Daume III [mailto:[EMAIL PROTECTED]] 
| Sent: 06 August 2002 19:20
| To: Haskell Mailing List
| Subject: ugliness with state parameter in ST stuff
| 
| 
| Sorry for the flood of emails this morning, but I've got 
| something which has really got me scratching my head.
| 
| Suppose I have a class:
| 
|  class Foo a where
|  foo :: a - IO Int
| 
| and a datatype with a single function:
| 
|  data Bar s = Bar (STArray s Int Int)
|  
|  getFirst :: Bar s - ST s Int
|  getFirst (Bar arr) = readArray arr 0
| 
| Now, I want to make (Bar s) and instance of Foo.  But I can't 
| seem to do this.  If I use:
| 
|  instance Foo (Bar s) where
|  foo = stToIO . getFirst
| 
| GHC complains:
| 
| Cannot unify the type-signature variable `s'
|   with the type `RealWorld'
|   Expected type: Bar s - IO Int
|   Inferred type: Bar RealWorld - IO Int
| In the expression: stToIO . getFirst
| In the definition of `foo': stToIO . getFirst
| 
| and if I use:
| 
|  instance Foo (Bar s) where
|  foo = return . runST . getFirst
| 
| GHC complains:
| 
| Inferred type is less polymorphic than expected
|   Quantified type variable `s' escapes
|   Expected type: ST s a - c
|   Inferred type: (forall s1. ST s1 a) - a
| In the first argument of `(.)', namely `runST'
| In the second argument of `(.)', namely `runST . getFirst'
| 
| Is there no way to do this?  I can change the definition of Foo to:
| 
|  class Foo2 a where
|  foo2 :: (forall s . a s) - IO Int
| 
| I can define:
| 
|  instance Foo2 Bar where
|  foo2 = stToIO . getFirst
| 
| Which I suppose works, but the problem is that in real life, 
| Foo is Binary and I can't really change it.
| 
| Suggestions?  (Other than simply moving all my ST stuff over to the IO
| monad?)
| 
|  - Hal
| 
| --
| Hal Daume III
| 
|  Computer science is no more about computers| [EMAIL PROTECTED]
|   than astronomy is about telescopes. -Dijkstra | www.isi.edu/~hdaume
| 
| ___
| Haskell mailing list
| [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
| 
___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



RE: difference between (evaluate . runST) and stToIO

2002-08-28 Thread Simon Peyton-Jones

They aren't identical.  

runST guarantees to run a complete state thread that can't interact
with any other.  stToIO runs some imperative actions that might 
interact with other stToIO calls.

You might find it helpful to read 'State in Haskell' if you havn't
already done so.

Simon

| -Original Message-
| From: Hal Daume III [mailto:[EMAIL PROTECTED]] 
| Sent: 06 August 2002 18:55
| To: Haskell Mailing List
| Subject: difference between (evaluate . runST) and stToIO
| 
| 
| I can't seem to figure out what the difference is between using
| 
|   evaluate (runST action)
| 
| and
| 
|   stToIO action
| 
| when in the IO monad and running something in ST...they seem 
| to behave identically...are they?
| 
| If they are, why do they have different type signatures (one 
| is ST RealWorld a - IO a, while the other is (forall s. ST s 
| a) - IO a)?
| 
|  - Hal
| 
| --
| Hal Daume III
| 
|  Computer science is no more about computers| [EMAIL PROTECTED]
|   than astronomy is about telescopes. -Dijkstra | www.isi.edu/~hdaume
| 
| ___
| Haskell mailing list
| [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
| 
___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



RE: GHC bug,or Hugs feature?

2002-08-28 Thread Simon Peyton-Jones

There are two things going on.

1.  Hugs deals with mutual recursion in a more sophisticated
way than GHC.  Mark T is absolutely right, and the THIH paper explains.

2.  Furthermore,GHC implements the H98 requirement that the context of
all functions in a mutually recursive groups must be the same.  So
f :: Eq a = ...
g :: Ord a = ...
is illegal if f and g are mutually recursive.


Both these things arise from the way GHC translates mutually recursive
overloaded defns.  Consider

f :: Ord a = a - a - a
f x y = ...(x==y)...(xy)...(f y x)...

GHC translates it thus:

f ord_dict = let gr = select_gr ord_dict
 eq_dict = select_eq ord_dict
eq = select_eq eq_dict

fm x y = ...(eq x y)...(ord x y) ...(fm y x)...
   in
fm

Note that all the dictionary selection (and sometimes construction)
is done outside the loop, implemented by 'fm'.

Matters get more complicated when there is mutual recursion; suffice it
it say
that in order to pull the dictionary manipuation outside the loop, all
the contexts
must be the same.

Arguably, H98 and GHC are wrong, and the restrictions should be lifted.
GHC usually errs on the side of lifting restrictions (with
-fglasgow-exts) but on 
this occasion the benefit seemed slight, while it turns out that the
cost of
changing the way let/where is dealt with is not inconsiderable.  So I've
let
sleeping dogs lie.

I think it's a corner case that seldom matters.  Counter examples to
this
claim would be interesting.  At least I hope this explains what's
happening.

Simon



| -Original Message-
| From: Mark Tullsen [mailto:[EMAIL PROTECTED]] 
| Sent: 09 August 2002 20:31
| To: [EMAIL PROTECTED]
| Cc: Arthur Baars
| Subject: Re: GHC bug,or Hugs feature?
| 
| 
| I believe the incompatibilities are explained thus:
| 
|   In section 4.5.1 of the Haskell Report it only states that
|A dependency analysis transformation is first performed 
| to increase
| polymorphism
| 
|   But hugs appears to be using a more refined version of the 
| dependency
|   analysis as explained in section 11.6.3 of Mark Jones' paper Typing
|   Haskell in Haskell.  Read that section.
| 
| - Mark
| 
| 
| Arthur Baars wrote:
|  In Mark Jones' paper Typing Haskell in Haskell, I found the 
| following 
|  example(in the section on binding-groups):
|  
|  f   :: Eq a = a - Bool
|  f x = x==x || g True
|  g y = y=y || f True
|  
|  According to the paper the inferred type of g should be:  
| g::Ord a = 
|  a - Bool
|  
|  Hugs infers this type but GHC infers the following 
| *ambiguous* type: 
|  *Main :i g
|  -- g is a variable, defined at Test.hs:25
|  g :: forall a. (Eq a) = Bool - Bool
|  
|  When adding an explicit type signature for g, Hugs happily 
| accepts the 
|  code, but GHC gives the following error:
|  
|  f   :: Eq a = a - Bool
|  f x = x==x || g True
|  g   :: Ord a = a - Bool
|  g y = y=y || f True
|  
|  Test.hs:24:
|  Couldn't match `{Ord a}' against `{Eq a1}'
|  When matching the contexts of the signatures for
|g :: forall a. (Ord a) = a - Bool
|f :: forall a. (Eq a) = a - Bool
|  The signature contexts in a mutually recursive group 
| should all be 
|  identical
|  When generalising the type(s) for g, f
|  Failed, modules loaded: none.
|  
|  I think the problems are caused by differences in the binding group 
|  analysis in Hugs and GHC.
|  
|  Malcolm, could you check what NHC says about the examples above?
|  
|  Cheers,
|   Arthur
|  
|  ___
|  Haskell mailing list
|  [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
|  
| 
| 
| ___
| Haskell mailing list
| [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
| 
___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



Re: GpH Mosix

2002-08-28 Thread paul

On Wed, Aug 28, 2002 at 10:46:34AM +0100, Phil Trinder wrote:
 Paul,
 
 The GdH implementation is currently used here, and is basically in
 beta-release form. If you would use it we could wrap up a and
 X86/Linux version for you.

That will be very sweet! I'd love to play with this thing ;-)
Please post the link when it is ready.

 ...
 
 Don't know a lot about Mosix, but if the PVM calls in the 3 GUM
 communications modules can be replaced with Mosix shared-memory
 routines that would give a low effort port of GUM to a Mosix
 cluster. I'd expect Mosix communication to be *much* faster than
 PVM: it's so generic that it absorbs a lot of time, e.g.  probing
 for a message takes 2000 machine cycles.

That would be indeed a very good research field to work on, I guess
Murray's group will be interested to pick it up from here. Though we
are also experimenting some GpH stuff in a our company, we do not
have the required research force or skill (yet).

Regards,
.paul.
___
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell



SAS'02 Call for Participation -- Early Registration: * September 3 *

2002-08-28 Thread SAS2002



[ Please Distribute -- Apologies for Receiving Multiple Copies ]

[ CALL FOR PARTICIPATION: Early Registration Extended: * September 3 * ]

[ EU funded student grants available ]
--

CALL FOR PARTICIPATION
SAS'02
   The 9th International Static Analysis Symposium
Madrid, Spain
17 - 20 September 2002

--
 On-line Registration and Hotel Reservations:
   http://clip.dia.fi.upm.es/SAS02/
   Early registration date is ** September 3, 2002 **
--
  SAS'02 is Organized by: 
  Department of Computer Science, Technical University of Madrid

--

The Ninth International Static Analysis Symposium (SAS'02) will be
held at the Technical University of Madrid (UPM), co-located with
Logic-based Program Development and Transformation (LOPSTR'02), the
APPIA-GULP-PRODE Joint Conference on Declarative Programming (AGP'02),
and a number of workshops.

Static Analysis is increasingly recognized as a fundamental tool for
high performance implementations and verification systems of
high-level programming languages.  The series of Static Analysis
Symposia has served as the primary venue for presentation of
theoretical, practical, and application advances in the area.

Invited Talks include:

   Static Program Analysis via 3-Valued Logic
Thomas Reps, University of Wisconsin

   Open Modeling in Multi-stakeholder Distributed Systems: 
   Research and Tool Challenges
Robert J. Hall, ATT Labs Research

   An Algebraic Approach to the Static Analysis of Concurrent Software
Javier Esparza, University of Edinburgh

   Secrets of Software Model Checking   
Thomas Ball, Microsoft Research

Accepted papers:

Static Analysis of the Numerical Stability of Loops 
  Martel Matthieu

Modular Control Flow Analysis for Libraries 
  Christian Probst

On termination of programs with real numbers computations
  Alexander Serebrenik and Danny De Schreye

Polynomial Constants are Decidable 
  Markus Müller-Olm and Helmut Seidl

Normalizable Horn clauses,  Strongly Recognizable Relations and Spi
  Flemming Nielson, Hanne Riis Nielson, and Helmut Seidl

Detecting Optimal Termination Conditions of Logic  Programs 
  Fred Mesnard, Etienne Payet, and Ulrich Neumerkel

Representing and approximating transfer functions in Abstract
  Interpretation of hetereogeneous datatypes 
  Bertrand Jeannet 

Improving the Precision of Equality-Based Dataflow Analyses 
  Erik Ruf

From Secrecy to Authenticity in Security Protocols 
  Bruno Blanchet

Checking Safety Properties of Behavioral VHDL Descriptions by Abstract
  Interpretation
  Charles Hymans

Refinement of LTL Formulas for Abstract Model Checking 
  Maria del Mar Gallardo, Pedro Merino, and Ernesto Pimentel

Making Abstract Model Checking Strongly Preserving 
  Francesco Ranzato and Francesco Tapparo

Static Confidentiality Enforcement for Distributed Programs 
  Andrei Sabelfeld and Heiko Mantel

More Precise Yet Efficient Type Inference for Logic Programs
  Claudio Vaucheret and Francisco Bueno

A Few Graph-Based Relational Numerical Abstract Domains 
  Antoine Mine'

Pipeline Modeling for Timing Analysis 
  Marc Langenbach, Stephan Thesing, and Reinhold Heckmann

Compactly Representing First-Order Structures for Static Analysis
  R. Manevich, G.Ramalingam, J. Field, D. Goyal, and M. Sagiv

Semantics for Abstract Interpretation-Based Static Analyzes of
  Temporal Properties 
  Damien Masse 

States vs. Traces in Model Checking by Abstract Interpretation 
  Roberto Giacobazzi and Francesco Ranzato

Speeding Up Dataflow Analysis Using Flow-Insensitive Pointer Analysis
  Stephen Adams, Thomas Ball, Manuvir Das, Sorin Lerner, Sriram K. Rajamani, 
  Mark Seigle, and Westley Weimer

Analysing Approximate Confinement under Uniform Attacks 
  Alessandra Di Pierro, Chris Hankin, and Herbert Wiklicky

Reuse of results in termination analysis of typed logic programs
  Maurice Bruynooghe, Michael Codish, Samir Genaim, and Wim Vanhoof

Backward Type Inference Generalises Type Checking 
  Lunjin Lu and Andy King

Security Typings by Abstract Interpretation 
  Mirko Zanotti

Possibly Not Closed Convex Polyhedra and the Parma Polyhedra Library
  R. Bagnara, E. Ricci, E. Zaffanella, and P. M. Hill 

Reliable Optimization for Imperative Languages: Proving Nullspace
 Properties of Compilers 
  Todd L. Veldhuizen and Andrew Lumsdaine

Representation Analysis for Coercion Placement 
  Karl-Filip Faxen

Ensuring Termination of Offline Partial Evaluation in Polynomial Time
  (A New Finiteness Analysis) 
  Chin Soon Lee 

Automated Verification of 

Welcome to Floralplanet.com- thanks for stopping By!

2002-08-28 Thread Visit Earth's Largest Garden today!



Floralplanet.com
http://www.floralplanet.com
 Visit Earth's Largest Garden and see
theInternets
mostspectacular one-stop superstore for fresh flowers,
silks, gift baskets,batiks, art, and other exciting gifts
!!Visit
Planet Bouquets !Now at a Galaxy near You
!http://www.floralplanet.com/planetbouquets1.htm
Visit Planet Gift Baskets !http://www.floralplanet.com/giftbaskets1.htm
Visit the Planet Gallery !http://www.floralplanet.com/planetgallery.html
Visit Planet Rainforest !http://www.floralplanet.com/planetrainforest.htm
Visit Planet Reef !http://www.floralplanet.com/planetreef.htm
A Planet Wish for You !http://www.floralplanet.com/planetwishes.htmSeptember 11th Tributehttp://www.floralplanet.com/usatributepage1.htm
RegisterNoW! for
ExclusiveMembership and automatically enter
Planet Sweepstakes !http://www.floralplanet.com/registration1.htmThanks
for stopping by our garden !
 
Bryan S. TartusCEOFloralplanet.comhttp://www.floralplanet.comTo Unsubscribe
Please Click Reply and Type Unsubscribe in SubjectSorry if we have
caused any inconvienence. Peace on Earth.
Floralplanet.com - US Trademark 2002All Rights
ReservedEarth's Largest Garden- US Trademark 2002All Rights
Reserved






RE: Question aboutthe use of an inner forall

2002-08-28 Thread Simon Peyton-Jones

No, this is a bug, thank you.  Will fix.

Simon

| -Original Message-
| From: Ashley Yakeley [mailto:[EMAIL PROTECTED]] 
| Sent: 19 August 2002 11:31
| To: Jay Cox; Haskell Cafe List
| Subject: Re: Question aboutthe use of an inner forall
| 
| 
| At 2002-08-18 20:19, Jay Cox wrote:
| 
| #ST runST (newSTRef (3::Prelude.Int))
| #
| #Ambiguous type variable(s) `a' in the constraint `PrelShow.Show a' 
| #arising from use of `PrelIO.print' at No locn #In a 'do' 
| expression 
| pattern binding: PrelIO.print it
| 
| I don't understand this either, actually:
| 
|   $ ghci -fglasgow-exts -package lang 
|  ___ ___ _
| / _ \ /\  /\/ __(_)
|/ /_\// /_/ / /  | |  GHC Interactive, version 5.04, 
| for Haskell 
| 98.
|   / /_\\/ __  / /___| |  http://www.haskell.org/ghc/
|   \/\/ /_/\/|_|  Type :? for help.
|   
|   Loading package base ... linking ... done.
|   Loading package haskell98 ... linking ... done.
|   Loading package lang ... linking ... done.
|   Prelude :module ST
|   Prelude ST :type runST
|   
|   Inferred type is less polymorphic than expected
|   Quantified type variable `s' escapes
|   Expected type: ST s a - t
|   Inferred type: (forall s1. ST s1 a) - a
|   Prelude ST 
| 
| What's up with that? Can't I even look at the type? Is this the 
| monomorphism restriction or something?
| 
| -- 
| Ashley Yakeley, Seattle WA
| 
| ___
| Haskell-Cafe mailing list
| [EMAIL PROTECTED] 
| http://www.haskell.org/mailman/listinfo/haskell-cafe
| 
___
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe