
On Oct 21, 2007, at 6:41 , Peter Hercek wrote:
Brandon S. Allbery KF8NH wrote:
On 19/10/2007, Kalman Noel
wrote: data ExistsNumber = forall a. Num a => Number a
I'm without a Haskell compiler, but shouldn't that be "exists a."? The problem is that "exists" is not valid in either Haskell 98 or any current extension, whereas "forall" is a very common extension. But you can simulate "exists" via "forall", which is
On Oct 19, 2007, at 12:11 , Sebastian Sylvan wrote: the thrust of these approaches.
When 'exists' is not a keyword, why 'forall' is needed at all?
NB. Haskell98 doesn't have forall. All type variables are implicitly scoped to the entire type (e.g. foo :: (a -> b) -> a -> b is actually foo :: forall a b. (a -> b) -> a -> b). The point of the forall keyword is that it can be scoped. Compare runState to runST: ST carries around a bracketed forall on the state expression (forall s. ST s a), preventing it from being viewed or modified (or initialized!) outside the scope established by runST, whereas you can carry around a State (State s a) and thread the state s through an expression "by hand" via evalState / execState (or pattern matching on the State value, which is what those translate to after a pass through runState). Given scoped forall, you can simulate exists by using something very like (identical to, via Curry-Howard?) de Morgan's Rule. -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH