[Haskell-cafe] CBN, CBV, Lazy in the same final tagless framework

2009-10-08 Thread oleg

Actually it is possible to implement all three evaluation orders
within the same final tagless framework, using the same interpretation
of types and reusing most of the code save the semantics of lam. That
is where the three orders differ, by their own definition.

In call-by-name, we have
lam f   = S . return $ (unS . f . S)

In call-by-value, we have
lam f   = S . return $ (\x - x = unS . f . S . return)

In call-by-need, we have
lam f   = S . return $ (\x - share x = unS . f . S)

In CBV, the function first evaluates its argument, whether the value
will be needed or not. In call-by-need, we arrange for the sharing of
the result should the computation be evaluated.

Here is an illustrative test

t2 :: HOAS exp = exp IntT
t2 = (lam $ \z - lam $ \x - let_ (x `add` x)
  $ \y - y `add` y) `app` (int 100 `sub` int 10)
 `app` (int 5 `add` int 5)

t2SN = runName t2 = print
{-
*CB t2SN
Adding
Adding
Adding
Adding
Adding
Adding
Adding
40
-}
In CBN, the result of subtraction was not needed, and so it was not performed
OTH, (int 5 `add` int 5) was computed four times.


t2SV = runValue t2 = print
{-
*CB t2SV
Subtracting
Adding
Adding
Adding
40
-}
In CBV, although the result of subtraction was not needed, it was
still performed. OTH, (int 5 `add` int 5) was computed only once.

t2SL = runLazy t2 = print
{-
*CB t2SL
Adding
Adding
Adding
40
-}
Now, Lazy is better than both CBN and CBV: subtraction was not needed,
and it was not performed.  All other expressions were needed, and
evaluated once.

The complete code is at
http://okmij.org/ftp/tagless-final/CB.hs


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] What *is* a DSL?

2009-10-08 Thread oleg

Perhaps it would be appropriate to point out the IFIP conference on
exactly that topic, DSL. The conference took place in July, here is
the permanent record:
http://dsl09.blogspot.com/

with pointers to the slides and the discussions.
The panel discussion has debated that very question, what exactly is
DSL. 
http://dsl09.blogspot.com/2009/07/panel.html

As you can see, the agreement could not be reached on what is Domain.
There will be another DSL conference, in Australia. Perhaps all the
Haskell-Cafe debaters may want to participate.


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Cabal, sdist and flags

2009-10-08 Thread Magnus Therning
A while ago I moved a project away from using a mix of Cabal and make
to build (Cabal to build the library and make to build the tests) to
using only Cabal.  I added a flag and then made a construct like this:

  flag BuildTests
  Description: Build unit and quickcheck tests.
  Default: False
  ...
  executable tests
  if flag(BuildTests)
  main-is: Test.hs
  build-depends: test-framework, test-framework-hunit, HUnit,
test-framework-quickcheck2, QuickCheck = 2.1.0.0
  hs-source-dirs: test-src src
  else
  main-is: Test.hs
  buildable: False

Interestingly that does work for things like 'configure' and 'build',
but it doesn't work for 'sdist':

  % ./Setup.hs sdist
  Distribution quality errors:
  Building source dist for dataenc-0.13.0.1...
  Setup.hs: Test.hsTest.hs doesn't exist

To make this work I had to move the 'main-is' outside of the if-else:

  executable tests
  main-is: Test.hs
  hs-source-dirs: test-src src
  if flag(BuildTests)
  build-depends: test-framework, test-framework-hunit, HUnit,
test-framework-quickcheck2, QuickCheck = 2.1.0.0
  else
  buildable: False

I found this surprising, so I'm tempted to call it a bug.  A quick
search didn't tell me whether this is well-known already, hence the
email.  Would you consider it a bug?  Has it been raised already?

/M

-- 
Magnus Therning(OpenPGP: 0xAB4DFBA4)
magnus@therning.org  Jabber: magnus@therning.org
http://therning.org/magnus identi.ca|twitter: magthe
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [solved] Re: [Haskell-cafe] Calling Haskell from C, Linking with gcc?

2009-10-08 Thread Wouter Swierstra


On 7 Oct 2009, at 23:39, John Velman wrote:

For anyone following this:  The XCode ld script is complex, and has  
mac
specific defaults early in the search path specification, and I  
probably

don't want to change these.  A library in a default path is the wrong
libgmp.[dylib | a].


Is there any chance you'll write up exactly what you needed to do on a  
blog/TMR article/Haskell wiki page? I've tried doing something  
similar, ran into linking problems, and gave up my fight with XCode. I  
think this would be a really useful resource for both Obj-C  
programmers looking into Haskell and Haskell programmers who want to  
have a fancy Cocoa GUI. Thanks!


  Wouter

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Cabal, sdist and flags

2009-10-08 Thread Sean Leather

 To make this work I had to move the 'main-is' outside of the if-else:

  executable tests
  main-is: Test.hs
  hs-source-dirs: test-src src
  if flag(BuildTests)
  build-depends: test-framework, test-framework-hunit, HUnit,
 test-framework-quickcheck2, QuickCheck = 2.1.0.0
  else
  buildable: False

 I found this surprising, so I'm tempted to call it a bug.  A quick
 search didn't tell me whether this is well-known already, hence the
 email.  Would you consider it a bug?  Has it been raised already?


I do something similar with EMGM, but I never tried to put the main-is
inside the if. I just did this for the test executable.

  if flag(test)
build-depends:  QuickCheck = 2.1   2.2,
HUnit = 1.2   1.3
  else
buildable:  False


Sean
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] type inference question

2009-10-08 Thread minh thu
Hi,

I'd like to know what are the typing rules used in Haskell (98 is ok).

Specifically, I'd like to know what makes

let i = \x - x in (i True, i 1)

legal, and not

let a = 1 in (a + (1 :: Int), a + (1.0 :: Float))

Is it correct that polymorphic functions can be used polymorphically
(in multiple places) while non-functions receive a monomorphic type ?

Also, I'd like to know why

id id True

is permitted but not

(\f - f f True) id

Is it possible to change the later expression so it type checks ? Are
there any type inference algorithms that would accept it ?

I'm asking this because I have implemented a simple type inference
algorithm following PLAI and I can infer the type for id id True
(because I use fresh type variable names for id whenever I apply it
before unification) and have an occur check fail for the later
expression, just like in haskell.

Thanks,
Thu
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread Martijn van Steenbergen

minh thu wrote:

Also, I'd like to know why

id id True

is permitted but not

(\f - f f True) id


Because this requires rank-2 types:


Prelude :set -XScopedTypeVariables
Prelude :set -XRank2Types
Prelude (\(f :: forall a. a - a) - f f True) id
True


HTH,

Martijn.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread Jochem Berndsen
minh thu wrote:
 Also, I'd like to know why

 id id True

 is permitted but not

 (\f - f f True) id

If you want to do this, answer the question what is the type of (\f -
f f True)?
You can do this, by the way, using rank-2 types:
 {-# LANGUAGE Rank2Types, PatternSignatures #-}
 thisIsAlwaysTrue = (\ (f :: forall a. a - a) - f f True) id

Cheers, Jochem
-- 
Jochem Berndsen | joc...@functor.nl | joc...@牛在田里.com
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Happstack + network package issue on the Mac

2009-10-08 Thread Sean Leather
We have run into an issue that it seems other people have already found but
has apparently not been resolved, yet. It manifests as with the error HTTP
request failed with: Unsupported socket. The problem is described in two
places with different workarounds.

  http://code.google.com/p/happstack/issues/detail?id=88
  http://groups.google.com/group/HAppS/msg/0c9a0d0fd7c6aff0

One workaround is to rewrite part of the network package, and the other is
to downgrade the package. It could be the case that the rewrite came from
the older version, though I'm not sure.

I'm curious if it is possible to fix this, either in Happstack or the
network package, once and for all. The workarounds are rather painful when
so many things depend on the network package.

Thanks,
Sean
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] random question

2009-10-08 Thread Nicolas Pouillard
Excerpts from Bryan O'Sullivan's message of Wed Oct 07 23:25:10 +0200 2009:
 On Wed, Oct 7, 2009 at 1:59 PM, Michael Mossey m...@alumni.caltech.eduwrote:
 
  My thread about randomness got hijacked so I need to restate my remaining
  question here. Is it acceptable to write pure routines that use but do not
  return generators, and then call several of them from an IO monad with a
  generator obtained by several calls to newStdGen?
 
  shuffle :: RandomGen g = g - [a] - [a]
  shuffle = ...
 
  foo :: [a] - [a] - IO ()
  foo xs ys = do
   g1 - newStdGen
   print $ shuffle g1 xs
   g2 - newStdGen
   print $ shuffle g2 ys
 
  Does this kind of thing exhibit good pseudorandomness?
 
 
 If you believe in the safety of the split operation (which I don't), then
  
 |
Can you elaborate on that?  -+

Best regards,

-- 
Nicolas Pouillard
http://nicolaspouillard.fr
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Cabal, sdist and flags

2009-10-08 Thread Duncan Coutts
On Thu, 2009-10-08 at 09:31 +0100, Magnus Therning wrote:
 A while ago I moved a project away from using a mix of Cabal and make
 to build (Cabal to build the library and make to build the tests) to
 using only Cabal.  I added a flag and then made a construct like this:

[..]

 Interestingly that does work for things like 'configure' and 'build',
 but it doesn't work for 'sdist':

 I found this surprising, so I'm tempted to call it a bug.  A quick
 search didn't tell me whether this is well-known already, hence the
 email.  Would you consider it a bug?  Has it been raised already?

Yes, I'd consider it a bug. I don't think it has been reported.

Duncan

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] #include path

2009-10-08 Thread Duncan Coutts
On Thu, 2009-10-08 at 00:37 -0400, Sean McLaughlin wrote:
 Hi,
 
 
   I'm trying to compile some code using Cabal.  One of the files has a
 CPP directive
 
 
 #include undefined.h
 
 
 The file undefined.h is in the same directory as the file with the
 directive.

That works fine for me.

I've got:

foo.cabal
Foo/Bar.hs
Foo/undefined.h

Bar.hs has the #include undefined.h directive. This works because cpp
looks first in the directory containing the file it is processing at the
time, ie the directory containing Foo/Bar.hs.

 If I use the full path name, cabal can compile it.  However, if I use
 the relative path, it complains about not being able to find the file.

Do you mean cpp (invoked by cabal/ghc) cannot find the undefined.h file
when compiling? If this is the case we'll need more details.

When you say full path name do you mean the full absolute path name all
the way from /, or do you mean relative to the root of the project (ie
the dir with the .cabal file)?

 I tried adding it to extra-source-files, but that didn't help.

Or do you mean it does not get included into the sdist tarball, and thus
is missing when you build from the tarball? That would be a use case for
extra-source-files.

  I see that Hackage packages like Agda use this trick, so I know it's
 possible.  How can I get these paths worked out correctly?
 There isn't much comment in the Cabal docs.

I'm not clear about which stage is failing.

Duncan


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread minh thu
2009/10/8 Jochem Berndsen joc...@functor.nl:
 minh thu wrote:
 Also, I'd like to know why

 id id True

 is permitted but not

 (\f - f f True) id

 If you want to do this, answer the question what is the type of (\f -
 f f True)?
 You can do this, by the way, using rank-2 types:
 {-# LANGUAGE Rank2Types, PatternSignatures #-}
 thisIsAlwaysTrue = (\ (f :: forall a. a - a) - f f True) id

 Cheers, Jochem

So I learned we should be explicit about f being used polymorphically;
that's what rank-2 types are for. (correct ?)

Thanks,
Thu
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread Cristiano Paris
On Thu, Oct 8, 2009 at 11:04 AM, minh thu not...@gmail.com wrote:
 Hi,

 I'd like to know what are the typing rules used in Haskell (98 is ok).

 Specifically, I'd like to know what makes

 let i = \x - x in (i True, i 1)

 legal, and not

 let a = 1 in (a + (1 :: Int), a + (1.0 :: Float))

 Is it correct that polymorphic functions can be used polymorphically
 (in multiple places) while non-functions receive a monomorphic type ?

First, 1 IS a constant function so it's in no way special and is a
value like any other.

That said, the type of 1 is (Num t) = t, hence polymorphic. But, when
used in the first element of the tuple, a is assigned a more concrete
type (Int) which mismatches with the second element of the tuple,
which is a Float.

If you swap the tuple, you'll find that the error reported by ghci is
the very same as before, except that the two types are swapped.

Is it possible to rewrite the expression so as to work? The answer is
yes, using existential quantification (and Rank2 polymorphism).

Here you are:
{-# LANGUAGE ExistentialQuantification, Rank2Types #-}
foo :: (forall a. (Num a) = a) - (Int,Float)
foo = \x - (x + (1 :: Int), x + (1 :: Float))

Hence:

foo 1 -- (2,2.0)

Bye,

Cristiano
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread Deniz Dogan
2009/10/8 Cristiano Paris fr...@theshire.org:
 On Thu, Oct 8, 2009 at 11:04 AM, minh thu not...@gmail.com wrote:
 Hi,

 I'd like to know what are the typing rules used in Haskell (98 is ok).

 Specifically, I'd like to know what makes

 let i = \x - x in (i True, i 1)

 legal, and not

 let a = 1 in (a + (1 :: Int), a + (1.0 :: Float))

 Is it correct that polymorphic functions can be used polymorphically
 (in multiple places) while non-functions receive a monomorphic type ?

 First, 1 IS a constant function so it's in no way special and is a
 value like any other.

I thought all functions in lambda calculus, technically, take exactly
one argument?

-- 
Deniz Dogan
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread Lennart Augustsson
The reason a gets a single type is the monomorphism restriction (read
the report).
Using NoMonomorphismRestriction your example with a works fine.

On Thu, Oct 8, 2009 at 12:29 PM, Cristiano Paris fr...@theshire.org wrote:
 On Thu, Oct 8, 2009 at 11:04 AM, minh thu not...@gmail.com wrote:
 Hi,

 I'd like to know what are the typing rules used in Haskell (98 is ok).

 Specifically, I'd like to know what makes

 let i = \x - x in (i True, i 1)

 legal, and not

 let a = 1 in (a + (1 :: Int), a + (1.0 :: Float))

 Is it correct that polymorphic functions can be used polymorphically
 (in multiple places) while non-functions receive a monomorphic type ?

 First, 1 IS a constant function so it's in no way special and is a
 value like any other.

 That said, the type of 1 is (Num t) = t, hence polymorphic. But, when
 used in the first element of the tuple, a is assigned a more concrete
 type (Int) which mismatches with the second element of the tuple,
 which is a Float.

 If you swap the tuple, you'll find that the error reported by ghci is
 the very same as before, except that the two types are swapped.

 Is it possible to rewrite the expression so as to work? The answer is
 yes, using existential quantification (and Rank2 polymorphism).

 Here you are:
 {-# LANGUAGE ExistentialQuantification, Rank2Types #-}
 foo :: (forall a. (Num a) = a) - (Int,Float)
 foo = \x - (x + (1 :: Int), x + (1 :: Float))

 Hence:

 foo 1 -- (2,2.0)

 Bye,

 Cristiano
 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] What *is* a DSL?

2009-10-08 Thread George Pollard
I'd also like to note that the canonical pronunciation of DSL ends in -izzle.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread minh thu
Thanks all!
Thu

2009/10/8 Lennart Augustsson lenn...@augustsson.net:
 The reason a gets a single type is the monomorphism restriction (read
 the report).
 Using NoMonomorphismRestriction your example with a works fine.

 On Thu, Oct 8, 2009 at 12:29 PM, Cristiano Paris fr...@theshire.org wrote:
 On Thu, Oct 8, 2009 at 11:04 AM, minh thu not...@gmail.com wrote:
 Hi,

 I'd like to know what are the typing rules used in Haskell (98 is ok).

 Specifically, I'd like to know what makes

 let i = \x - x in (i True, i 1)

 legal, and not

 let a = 1 in (a + (1 :: Int), a + (1.0 :: Float))

 Is it correct that polymorphic functions can be used polymorphically
 (in multiple places) while non-functions receive a monomorphic type ?

 First, 1 IS a constant function so it's in no way special and is a
 value like any other.

 That said, the type of 1 is (Num t) = t, hence polymorphic. But, when
 used in the first element of the tuple, a is assigned a more concrete
 type (Int) which mismatches with the second element of the tuple,
 which is a Float.

 If you swap the tuple, you'll find that the error reported by ghci is
 the very same as before, except that the two types are swapped.

 Is it possible to rewrite the expression so as to work? The answer is
 yes, using existential quantification (and Rank2 polymorphism).

 Here you are:
 {-# LANGUAGE ExistentialQuantification, Rank2Types #-}
 foo :: (forall a. (Num a) = a) - (Int,Float)
 foo = \x - (x + (1 :: Int), x + (1 :: Float))

 Hence:

 foo 1 -- (2,2.0)

 Bye,

 Cristiano
 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] What *is* a DSL?

2009-10-08 Thread Colin Paul Adams
 George == George Pollard por...@porg.es writes:

George I'd also like to note that the canonical pronunciation of
George DSL ends in -izzle.

Whose canon?

Interestingly, I have always assumed the canonical pronunciation of
DSSSL was diesel, as JADE stands for JAmes's DSSSL Engine.

I don't see why removing extra S-es should shorten the vowel.
-- 
Colin Adams
Preston Lancashire
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Libraries for Commercial Users

2009-10-08 Thread Iain Barnett


On 8 Oct 2009, at 00:41, Curt Sampson wrote:


On 2009-10-02 09:03 -0600 (Fri), John A. De Goes wrote:


[Haskell] is missing many key libraries that would be of great
commercial value.


Just out of curiousity, can you give me some examples of what you feel
these are?



Relational database libraries that work and have proper documentation  
i.e. those homework killers - examples, not just API docs or half  
finished wikis. Just google up how to connect to a database in any  
well-used (commercially) language and there will be a ton of fully  
fleshed out docs with examples I can cut n paste from.* No thinking,  
no time wasted, just get it done and get on with the real stuff.  
Haskell doesn't have that, and Happs isn't going to replace all those  
databases out there. (yet)



*If you don't like the idea of cut n paste coding don't complain to  
me, it's given me a career and I'm grateful for that.



Iain


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] On DSLs - one last time

2009-10-08 Thread Günther Schmidt

Hi all,

I'd like to summarize my impressions on the DSL issue, gathered from the  
responses to my posts.


It is absolutely amazing, various people have shown here that it is  
possible to design languages within haskell that are almost or just as  
powerful and safe as haskell itself. It is probably even possible to  
create an EDSL within an EDSL within haskell.


Amazing!


Uhm...

... but in that case I really wonder why I should not use Haskell directly  
then.


Because out of the EDSL I can clearly see the E and I can see the L  
but having slight problems figuring out where the D and the S come in.


In short, yes it's great that you can create a language within Haskell so  
powerful that it's gone full circle and is general purpose again, but what  
good is that?


The efforts I've seen here where efforts to create a rich and powerful  
syntax, but aren't we supposed to focus on expressing semantics specific  
to a problem in a DSL rather?


I'm not trying to put the efforts and achievements of the people who have  
done such amazing work down, but what exactly is it that I missed?


Günther

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Happstack + network package issue on the Mac

2009-10-08 Thread Gregory Collins
Sean Leather leat...@cs.uu.nl writes:

 We have run into an issue that it seems other people have already
 found but has apparently not been resolved, yet. It manifests as with
 the error HTTP request failed with: Unsupported socket. The problem
 is described in two places with different workarounds.

   http://code.google.com/p/happstack/issues/detail?id=88
   http://groups.google.com/group/HAppS/msg/0c9a0d0fd7c6aff0

 One workaround is to rewrite part of the network package, and the
 other is to downgrade the package. It could be the case that the
 rewrite came from the older version, though I'm not sure.

 I'm curious if it is possible to fix this, either in Happstack or the
 network package, once and for all. The workarounds are rather painful
 when so many things depend on the network package.

The following patch to happstack works for me:

Mon May  4 10:35:54 EDT 2009  Gregory Collins g...@gregorycollins.net
  * Local fix: make networking work
  Ignore-this: f46cdf40b26ac1ca72e50b05c772c259
diff -rN -u old-happstack/happstack-server/src/Happstack/Server/HTTP/Socket.hs new-happstack/happstack-server/src/Happstack/Server/HTTP/Socket.hs
--- old-happstack/happstack-server/src/Happstack/Server/HTTP/Socket.hs	2009-10-08 10:34:22.0 -0400
+++ new-happstack/happstack-server/src/Happstack/Server/HTTP/Socket.hs	2009-10-08 10:34:22.0 -0400
@@ -24,29 +24,11 @@
   (sock', addr) - S.accept sock
   h - S.socketToHandle sock' ReadWriteMode
   (N.PortNumber p) - N.socketPort sock'
-  
-  let peer = $(if supportsIPv6
- then
- return $ CaseE (VarE (mkName addr)) 
-[Match 
- (ConP (mkName S.SockAddrInet) 
-  [WildP,VarP (mkName ha)]) 
- (NormalB (AppE (VarE (mkName showHostAddress)) 
-   (VarE (mkName ha []
-,Match (ConP (mkName S.SockAddrInet6) [WildP,WildP,VarP (mkName ha),WildP])
- (NormalB (AppE (VarE (mkName showHostAddress6)) (VarE (mkName ha []
-,Match WildP (NormalB (AppE (VarE (mkName error)) (LitE (StringL Unsupported socket []]
- -- the above mess is the equivalent of this: 
- {-[| case addr of
-   (S.SockAddrInet _ ha)  - showHostAddress ha
-   (S.SockAddrInet6 _ _ ha _) - showHostAddress6 ha
-   _  - error Unsupported socket
-   |]-}
- else
- [| case addr of
-  (S.SockAddrInet _ ha)  - showHostAddress ha
-  _  - error Unsupported socket
- |])
- 
+
+  let peer = case addr of
+   (S.SockAddrInet _ ha)  - showHostAddress ha
+   (S.SockAddrInet6 _ _ ha _) - showHostAddress6 ha
+   _  - error Unsupported socket
+
   return (h, peer, p)
 
diff -rN -u old-happstack/happstack-server/src/Happstack/Server/HTTP/SocketTH.hs new-happstack/happstack-server/src/Happstack/Server/HTTP/SocketTH.hs
--- old-happstack/happstack-server/src/Happstack/Server/HTTP/SocketTH.hs	2009-10-08 10:34:22.0 -0400
+++ new-happstack/happstack-server/src/Happstack/Server/HTTP/SocketTH.hs	2009-10-08 10:34:22.0 -0400
@@ -8,9 +8,4 @@
 
 -- find out at compile time if the SockAddr6 / HostAddress6 constructors are available
 supportsIPv6 :: Bool
-supportsIPv6 = $(let c = Network.Socket.SockAddrInet6; d = ''SockAddr in
- do TyConI (DataD _ _ _ cs _) - reify d
-if isJust (find (\(NormalC n _) - show n == c) cs)
-   then [| True |]
-   else [| False |] )
-   
+supportsIPv6 = True


G.
-- 
Gregory Collins g...@gregorycollins.net
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] On DSLs - one last time

2009-10-08 Thread John Van Enk
To me, the D and S come in when I'm deciding what to support. The
domain represents the set of primitive operations I want to support. The
specific says that I don't support anything other than those operations.

Consider a language for laying out boolean logic circuits: we want to
implement only AND, OR, and XOR, and NOT. The domain is boolean logic. We
can't reason directly about trees or rainbows with this language, so it's
specific.

Our set of primitive operations would probably consist of:

1) Create input
2) Perform one of AND, OR, or XOR on two inputs (or proceeding inputs from
previous operations)
3) Apply a NOT to an operation.

With this basic set of operations, one can build up a graph of gates which
can then be executed directly, converted to some other intermediate form, or
plotted in graphical form. This is actually the focus domain of a small EDSL
I'm working on for demonstrative purposes. The following is a link to the
github repository and a direct link to one of the examples.

http://github.com/sw17ch/gator
http://github.com/sw17ch/gator/blob/master/examples/4bitAdder.hs

The example linked is a 4 bit adder (8 inputs, 4 outputs) that will dump
GraphViz 'dot' code.

This simple EDSL currently only allows you to construct graphviz, but the
intermediate Logic type could be transformed to just about anything having
to do with boolean logic or executed in place.

I hope some of this made sense.

/jve

2009/10/8 Günther Schmidt gue.schm...@web.de

 Hi all,

 I'd like to summarize my impressions on the DSL issue, gathered from the
 responses to my posts.

 It is absolutely amazing, various people have shown here that it is
 possible to design languages within haskell that are almost or just as
 powerful and safe as haskell itself. It is probably even possible to create
 an EDSL within an EDSL within haskell.

 Amazing!


 Uhm...

 ... but in that case I really wonder why I should not use Haskell directly
 then.

 Because out of the EDSL I can clearly see the E and I can see the L but
 having slight problems figuring out where the D and the S come in.

 In short, yes it's great that you can create a language within Haskell so
 powerful that it's gone full circle and is general purpose again, but what
 good is that?

 The efforts I've seen here where efforts to create a rich and powerful
 syntax, but aren't we supposed to focus on expressing semantics specific to
 a problem in a DSL rather?

 I'm not trying to put the efforts and achievements of the people who have
 done such amazing work down, but what exactly is it that I missed?

 Günther

 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread Cristiano Paris
On Thu, Oct 8, 2009 at 12:48 PM, Lennart Augustsson
lenn...@augustsson.net wrote:
 The reason a gets a single type is the monomorphism restriction (read
 the report).
 Using NoMonomorphismRestriction your example with a works fine.

Could you explain why, under NoMonomorphismRestriction, this typechecks:

let a = 1 in (a + (1 :: Int),a + (1 :: Float))

while this not:

foo :: Num a = a - (Int,Float)
foo k = (k + (1 :: Int), k + (1.0 :: Float))

Thanks!

Cristiano
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [solved] Re: [Haskell-cafe] Calling Haskell from C, Linking with gcc?

2009-10-08 Thread John Velman
On Thu, Oct 08, 2009 at 10:34:07AM +0200, Wouter Swierstra wrote:

 On 7 Oct 2009, at 23:39, John Velman wrote:

 For anyone following this:  The XCode ld script is complex, and has mac
 specific defaults early in the search path specification, and I probably
 don't want to change these.  A library in a default path is the wrong
 libgmp.[dylib | a].

 Is there any chance you'll write up exactly what you needed to do on a 
 blog/TMR article/Haskell wiki page? I've tried doing something similar, ran 
 into linking problems, and gave up my fight with XCode. I think this would 
 be a really useful resource for both Obj-C programmers looking into Haskell 
 and Haskell programmers who want to have a fancy Cocoa GUI. Thanks!

   Wouter

Yes, it is my intention to do just that.  Unfortunately, I don't always
follow through!  But with a specific request, I'll try to get it done in
the next few days.

I'll post the url here.

Best,

John Velman

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] type inference question

2009-10-08 Thread minh thu
2009/10/8 Cristiano Paris fr...@theshire.org:
 On Thu, Oct 8, 2009 at 12:48 PM, Lennart Augustsson
 lenn...@augustsson.net wrote:
 The reason a gets a single type is the monomorphism restriction (read
 the report).
 Using NoMonomorphismRestriction your example with a works fine.

 Could you explain why, under NoMonomorphismRestriction, this typechecks:

 let a = 1 in (a + (1 :: Int),a + (1 :: Float))

 while this not:

 foo :: Num a = a - (Int,Float)
 foo k = (k + (1 :: Int), k + (1.0 :: Float))

I think it is the same thing that my (\f - f f True) question, i.e.
the polymorphism of k is fixed inside foo (you don't want that). So I
guess using the rank-2 types and the corresponding type annotation to
keep k polymorph should work. In other words, foo is polymorph on k
but k is not polymorph when given to foo in a specific application.

Thu
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] How to add use custom preprocessor in cabal

2009-10-08 Thread Bernd Brassel

Hi folks,

I am trying to integrate my own preprocessor into a cabal build  
process. But there are several points that I get stuck with. Could  
someone help me, please?


A simplification of my problem:
I have files Abc.foo and each of them should be transformed into  
Abc.hs by calling function transform. The resulting Abc.hs files  
should then be exposed as Haskell library modules.


1. Question: How do I tell cabal that the file Abc.foo belongs to the  
package?
After reading the User's Guide I had the impression that I should  
write something like


Library
  Eposed-Modules:
  Abc.foo

But this leads to a parse error.

Adding a

Data-Files:
  Abc.foo

to the heading, on the other hand, does not seem to do anything.

2. Question: How to add the preprocessor? I have tried

main =
  defaultMainWithHooks
 simpleUserHooks{hookedPreProcessors=[(foo,transformation)]}

transformation :: BuildInfo - LocalBuildInfo - PreProcessor

But under which circumstances will this function be called? Up to now  
I have not succeeded in making cabal call this function.


Thanks for your time!
Bernd


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] more improvable randomness

2009-10-08 Thread Michael Mossey
I wrote some code to model the keystroke-to-keystroke delay in a person
typing, with pseudorandomness. There are two kinds of delays.. one is a
very small delay as the person reaches for a new key (call this 'reach'
delays), the other is a larger delay that represents a pause to think or
to take a break (call this 'break' delays).

My thought is that I could create an infinite series of reach delays and
an infinite series of break delays and zipWith (+).

The inifinite series of break delays would look like:

- The overall pattern is a large number of zeros, in the range (N,M)
followed by a single positive number, chosen from a distribution D... and
then repeat.

Here's some code. I used the Gen monad to gain access to the 'frequency'
function, which is useful, but I had trouble figuring out how to put the
whole algorithm into Gen. I also looked at Rand. The problem is that if I
want to create the list by 'sequence'ing a list of monads, they need to
have state that remembers how many zeros are left to go.



breakSeries :: Int - Int - StdGen - [Float]
breakSeries lowerB upperB gen =
   let (n,gen1) = randomR (lowerB,upperB) gen
   (gen2,gen3) = split gen1
   delay = generate 1 gen2 breakM
   in replicate n 0 ++ [delay] ++ breakSeries lowerB upperB gen3

breakM :: Gen Float
breakM = frequency [ (10, choose( 1::Float   ,  2))
   , (10, choose( 4::Float   ,  6)) ]

test = (print . take 100 . breakSeries 2 4 ) = newStdGen
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Let it be

2009-10-08 Thread michael rice
From Learn You a Haskell (Let it be section):

   1. cylinder :: (RealFloat a) = a - a - a  
   2. cylinder r h = 
   3. let sideArea = 2 * pi * r * h  
   4. topArea = pi * r ^2  
   5. in  sideArea + 2 * topArea
===



What's the proper indentation for LET so these problems (below) don't arise? I
thought LET and IN should be aligned in the same column. Also, isn't a
LET expression an expression.



Michael

==

This works:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
    in putStrLn $ Number is  ++ show randNumber

==

This works:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  putStrLn $ Number is  ++ show randNumber

==

This doesn't:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  in putStrLn $ Number is  ++ show randNumber

[mich...@localhost ~]$ runhaskell zz.hs

zz.hs:4:2:
    The last statement in a 'do' construct must be an expression





  ___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Re: Libraries for Commercial Users

2009-10-08 Thread John A. De Goes


Here's a list of libraries that are quite significant to commercial  
software development in 2009, but which either do not exist in  
Haskell, or if they exist, are hard to find, undocumented, unstable,  
or perhaps uncompilable:


	* A drop-in comet server, with JavaScript bindings (or compatible  
with existing JavaScript bindings).
	* A library for producing RESTful APIs, which does much of the work  
in mapping URLs into operations on a database.
	* Speaking of database, a robust, well-documented, cross-platform  
interface to popular databases, with a commercial-friendly license.
	* A scalable, fault-tolerant, distributed data store in the mold of  
BigTable, which provides map reduce. Or at least Haskell bindings for  
one, and a Haskellized wrapper around the binder.
	* A Haskell client for AMQP or other message broker, ideally reactive  
but anything's better than nothing. And while I'm at it, how about a  
100% Haskell message broker that takes advantage of Haskell's  
functional nature to deliver something of Erlang quality.
	* A scalable, fault-tolerant, distributed graph database that can be  
used for building and maintaining social networks.
	* A networking library that supports peer-to-peer communication,  
authentication, encryption, and other features via plug-ins, with  
seamless multicasting when possible.
	* Infrastructure for building Haskell cloud computing clusters that  
are scalable and fault-tolerant.
	* Search and other data mining libraries, with robust indexing  
features, and the capacity to scale indefinitely.

* Haskell interfaces to Twitter, Facebook, MySpace, Google, etc.
* etc.

In any one of these categories, Java has multiple implementations,  
sometimes 20 or more (yes, it's absurd at times, but it's also  
comforting because it means choosing Java is not risky). Many are  
meticulously documented with extensive Javadoc and tutorials.


And this just scratches the surface. Most apps today are web apps,  
meaning they have client and server portions. Some modern languages  
natively support cross-compilation (Haxe, Fan), and others such as  
Java can be cross-compiled with the aid of third-party packages (gwt,  
java2script), but not Haskell. Reusing code, and using a single  
language across different platforms opens up many new possibilities  
and greatly improves productivity and efficiency.


Let me ask you this question. How long would it take you to write a  
scalable first-pass Twitter clone? A good Java developer could do it  
in a week, maybe a day, and deploy it on AppEngine, where it will  
scale indefinitely with no effort. That's power.


The syntax of a language, no matter how beautiful or high-level,  
cannot compete with the billions of dollars worth of resources freely  
available for inferior languages like Java.


Haskell on the JVM with seamless Java interop (no need for method-by- 
method foreign import of information that's freely available via  
reflection) would go a long way towards leveling the playing field.


Regards,

John A. De Goes
N-Brain, Inc.
The Evolution of Collaboration

http://www.n-brain.net|877-376-2724 x 101

On Oct 7, 2009, at 5:41 PM, Curt Sampson wrote:


On 2009-10-02 09:03 -0600 (Fri), John A. De Goes wrote:


[Haskell] is missing many key libraries that would be of great
commercial value.


Just out of curiousity, can you give me some examples of what you feel
these are?

cjs
--
Curt Sampson   c...@starling-software.com+81 90 7737 2974
  Functional programming in all senses of the word:
  http://www.starling-software.com


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re[2]: [Haskell-cafe] type inference question

2009-10-08 Thread Bulat Ziganshin
Hello Cristiano,

Thursday, October 8, 2009, 7:14:20 PM, you wrote:

 Could you explain why, under NoMonomorphismRestriction, this typechecks:

 let a = 1 in (a + (1 :: Int),a + (1 :: Float))

 while this not:

 foo :: Num a = a - (Int,Float)
 foo k = (k + (1 :: Int), k + (1.0 :: Float))

i think it's because type is different:

foo :: (forall a. (Num a) = a) - (Int,Float)

in first equation it probably inferred correctly



-- 
Best regards,
 Bulatmailto:bulat.zigans...@gmail.com

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Market Place for Haskell development teams?

2009-10-08 Thread John A. De Goes


I don't dismiss Haskell in business. I only maintain it's a niche  
market.


There are some domains where the infrastructure in more established  
languages is minimal, and in such cases, I think Haskell can be more  
efficient than those languages.



I should note, too, the the agile development momement over the past
ten years has had and still does have exactly the same sort of attacks
on it, and yet has successfully moved into the mainstream and is
well-accepted by many parts of it.


What has moved into mainstream is unfortunately connected chiefly to  
agile by virtue of the word itself. Agile means more than getting  
software out the door quickly, a fact many businesses have yet to learn.


Regards,

John A. De Goes
N-Brain, Inc.
The Evolution of Collaboration

http://www.n-brain.net|877-376-2724 x 101

On Oct 7, 2009, at 5:49 PM, Curt Sampson wrote:


On 2009-10-02 09:04 -0600 (Fri), John A. De Goes wrote:


I'm not saying Haskell is unstable. I'm saying that the attitude
expressed in the following quote is at odds with the needs of  
business:


And as far as something like dealing with a changing language and
libraries, the mainstream already has well-established and popular
techniques for doing just: agile development.


I don't know how much commercial experience you have, but I've been a
founder of two companies, CTO or CEO of several businesses, a chief
architect in a couple more, and consider myself as much a businessman
and manager as a developer.

The attitude you express is certainly common in many businesses, but
it's not the only way to run a successful business.

I won't go further here, since this kind of argument generally leads
into a, no, what you do isn't possible kind of flamewar, but I did
want to point this out here, so that others can know that, the  
attitude
John De Goes expresses, while comon, is not the only way busineses  
look

at the world.

I should note, too, the the agile development momement over the past
ten years has had and still does have exactly the same sort of attacks
on it, and yet has successfully moved into the mainstream and is
well-accepted by many parts of it.

cjs
--
Curt Sampson   c...@starling-software.com+81 90 7737 2974
  Functional programming in all senses of the word:
  http://www.starling-software.com


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Let it be

2009-10-08 Thread Ross Mellgren
You're running into this problem because you're in a do-block. In a do- 
block, all the continuing lines of a single statement in the do-block  
must be indented w/r/t to the first line. The cylinder example doesn't  
have this issue because it's not in a do-block.


The layout rule (I'm summarizing and I haven't read the spec, so  
someone jump on me if I'm stating the wrong thing) basically says that  
within some implied { }, ;'s will be inserted for any line that is at  
the same indentation level as the previous line, e.g.


import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  in putStrLn $ Number is  ++ show randNumber

has the following implied symbols

import System.Random
main = do {
  gen - getStdGen
; let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
; in putStrLn $ Number is  ++ show randNumber
}

which is now obviously wrong, as the let and in are in two separate  
statements.



Conversely,

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
in putStrLn $ Number is  ++ show randNumber

implied:

import System.Random
main = do {
  gen - getStdGen
; let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
in putStrLn $ Number is  ++ show randNumber
}

Hope that clarifies things.

-Ross



On Oct 8, 2009, at 11:43 AM, michael rice wrote:


From Learn You a Haskell (Let it be section):

   1. cylinder :: (RealFloat a) = a - a - a
   2. cylinder r h =
   3. let sideArea = 2 * pi * r * h
   4. topArea = pi * r ^2
   5. in  sideArea + 2 * topArea
===

What's the proper indentation for LET so these problems (below)  
don't arise? I thought LET and IN should be aligned in the same  
column. Also, isn't a LET expression an expression.


Michael

==

This works:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
in putStrLn $ Number is  ++ show randNumber

==

This works:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  putStrLn $ Number is  ++ show randNumber

==

This doesn't:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  in putStrLn $ Number is  ++ show randNumber

[mich...@localhost ~]$ runhaskell zz.hs

zz.hs:4:2:
The last statement in a 'do' construct must be an expression



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Let it be

2009-10-08 Thread Brandon S. Allbery KF8NH

On Oct 8, 2009, at 11:43 , michael rice wrote:

This doesn't:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  in putStrLn $ Number is  ++ show randNumber

[mich...@localhost ~]$ runhaskell zz.hs

zz.hs:4:2:
The last statement in a 'do' construct must be an expression



The problem here is that the do construct parses things a bit  
differently; if you're at the same indentation level, it inserts a  
() on the assumption that the next line is an independent  
expression, so you need to indent the in a bit more to avoid it.


Note however that this usage is common enough that do provides a  
shorthand:  you can simply omit the in, and let will be parsed as  
if it were a statement:


 main = do
   gen - getStdGen
   let (randNumber, newGen) = randomR (1,6) gen :: (Int,StdGen)
   putStrLn $ Number is  ++ show randNumber

--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allb...@kf8nh.com
system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu
electrical and computer engineering, carnegie mellon universityKF8NH




PGP.sig
Description: This is a digitally signed message part
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Libraries for Commercial Users

2009-10-08 Thread John A. De Goes


Exactly, it's things like this that are so frustrating and which  
reduce efficiency. In a mature library, you don't need to handle  
details like this for yourself.


Regards,

John A. De Goes
N-Brain, Inc.
The Evolution of Collaboration

http://www.n-brain.net|877-376-2724 x 101

On Oct 7, 2009, at 6:44 PM, Erik de Castro Lopo wrote:


Curt Sampson wrote:


On 2009-10-02 09:03 -0600 (Fri), John A. De Goes wrote:


[Haskell] is missing many key libraries that would be of great
commercial value.


Just out of curiousity, can you give me some examples of what you  
feel

these are?


A version of Network.HTTP that accepts HTTPS URLs and does the right
thing instead of attempting to do a HTTP connection instead.

Erik
--
--
Erik de Castro Lopo
http://www.mega-nerd.com/
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Let it be

2009-10-08 Thread Brandon S. Allbery KF8NH

On Oct 8, 2009, at 11:53 , Brandon S. Allbery KF8NH wrote:
The problem here is that the do construct parses things a bit  
differently; if you're at the same indentation level, it inserts a  
() on the assumption that the next line is an independent  
expression, so you need to indent the in a bit more to avoid it.


I should probably clarify that what is actually inserted is a  
semicolon as noted by Ross Mellgren, and the next level of translation  
then replaces it with the () operator.


Note however that this usage is common enough that do provides a  
shorthand:  you can simply omit the in, and let will be parsed  
as if it were a statement:


 main = do
   gen - getStdGen
   let (randNumber, newGen) = randomR (1,6) gen :: (Int,StdGen)
   putStrLn $ Number is  ++ show randNumber



I should also mention that there are still constructs where this  
indentation quirk can bite you, notably:


   if foo
   then bar
   else baz

works outside of a do construct, but inside one you need extra spaces:

 do
   if foo
 then bar
 else baz

otherwise, you again get semicolons inserted before the then and  
else and subsequently replaced with ().


--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allb...@kf8nh.com
system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu
electrical and computer engineering, carnegie mellon universityKF8NH




PGP.sig
Description: This is a digitally signed message part
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: Re[2]: [Haskell-cafe] type inference question

2009-10-08 Thread Lennart Augustsson
Indeed, the types
  foo :: forall a . (Num a) = a - (Int, Float)
and
  foo :: (forall a . (Num a) = a) - (Int, Float)
are quite different.

The first one say, I (foo) can handle any kind of numeric 'a' you (the
caller) can pick. You (the caller) get to choose exactly what type you
give me.

The second one says, I (foo) require you (the caller) to give me an
numeric 'a' that I can use any way I want.  You (the caller) don't get
to choose what type you give me, you have to give me a polymorphic
one.

  -- Lennart

On Thu, Oct 8, 2009 at 5:35 PM, Bulat Ziganshin
bulat.zigans...@gmail.com wrote:
 Hello Cristiano,

 Thursday, October 8, 2009, 7:14:20 PM, you wrote:

 Could you explain why, under NoMonomorphismRestriction, this typechecks:

 let a = 1 in (a + (1 :: Int),a + (1 :: Float))

 while this not:

 foo :: Num a = a - (Int,Float)
 foo k = (k + (1 :: Int), k + (1.0 :: Float))

 i think it's because type is different:

 foo :: (forall a. (Num a) = a) - (Int,Float)

 in first equation it probably inferred correctly



 --
 Best regards,
  Bulat                            mailto:bulat.zigans...@gmail.com

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Test.QuickCheck: generate

2009-10-08 Thread Paul Johnson

On 08/10/09 04:57, David Menendez wrote:

On Wed, Oct 7, 2009 at 8:29 PM, Michael Mosseym...@alumni.caltech.edu  wrote:
   

In Test.QuickCheck, the type of 'generate' is

generate :: Int -  StdGen -  Gen a -  a

I can't find docs that explain what the Int does. Some docs are here:
 

Judging by the source code, the integer is the upper bound for the
size parameter. If you are generating a list, for example, it gives
the maximum size of the list
Thats right.  Its the size parameter, and what it does depends on the 
instance of Arbitrary.  Arbitrary numbers will be within +/- size.  
Arbitrary lists will be of maximum length size.  On the other hand 
arbitrary booleans will just be True or False.



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Let it be

2009-10-08 Thread michael rice
Thanks all,

So, in a do expression 

 let x = 1
 y = 2
 etc.
   in z = 1 + 2

  if bool expr
    then
  etc.
    else
  etc.

Is this deviation documented somewhere?

Michael

--- On Thu, 10/8/09, Brandon S. Allbery KF8NH allb...@ece.cmu.edu wrote:

From: Brandon S. Allbery KF8NH allb...@ece.cmu.edu
Subject: Re: [Haskell-cafe] Let it be
To: michael rice nowg...@yahoo.com
Cc: Brandon S. Allbery KF8NH allb...@ece.cmu.edu, haskell-cafe@haskell.org
Date: Thursday, October 8, 2009, 11:53 AM

On Oct 8, 2009, at 11:43 , michael rice wrote:This doesn't:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  in putStrLn $ Number is  ++ show randNumber

[mich...@localhost ~]$ runhaskell zz.hs

zz.hs:4:2:
    The last statement in a 'do' construct must be an expression

The problem here is that the do construct parses things a bit differently; if 
you're at the same indentation level, it inserts a () on the assumption that 
the next line is an independent expression, so you need to indent the in a 
bit more to avoid it.
Note however that this usage is common enough that do provides a shorthand:  
you can simply omit the in, and let will be parsed as if it were a 
statement:
 main = do   gen - getStdGen   let (randNumber, newGen) = randomR (1,6) gen 
 :: (Int,StdGen)   putStrLn $ Number is  ++ show randNumber
 -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] 
allb...@kf8nh.comsystem administrator [openafs,heimdal,too many hats] 
allb...@ece.cmu.eduelectrical and computer engineering, carnegie mellon 
university    KF8NH
 



  ___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Let it be

2009-10-08 Thread Ross Mellgren
I don't know of any offhand that specifically call it out -- it's a  
natural consequence of the layout rule which is described in the  
Haskell Report. However, there is at least one ticket in Haskell' to  
fix it for if/then/else: http://hackage.haskell.org/trac/haskell-prime/ticket/23


-Ross

On Oct 8, 2009, at 1:03 PM, michael rice wrote:


Thanks all,

So, in a do expression

 let x = 1
 y = 2
 etc.
   in z = 1 + 2

  if bool expr
then
  etc.
else
  etc.

Is this deviation documented somewhere?

Michael

--- On Thu, 10/8/09, Brandon S. Allbery KF8NH allb...@ece.cmu.edu  
wrote:


From: Brandon S. Allbery KF8NH allb...@ece.cmu.edu
Subject: Re: [Haskell-cafe] Let it be
To: michael rice nowg...@yahoo.com
Cc: Brandon S. Allbery KF8NH allb...@ece.cmu.edu, haskell-cafe@haskell.org
Date: Thursday, October 8, 2009, 11:53 AM

On Oct 8, 2009, at 11:43 , michael rice wrote:

This doesn't:

import System.Random
main = do
  gen - getStdGen
  let (randNumber, newGen) = randomR (1,6) gen :: (Int, StdGen)
  in putStrLn $ Number is  ++ show randNumber

[mich...@localhost ~]$ runhaskell zz.hs

zz.hs:4:2:
The last statement in a 'do' construct must be an expression



The problem here is that the do construct parses things a bit  
differently; if you're at the same indentation level, it inserts a  
() on the assumption that the next line is an independent  
expression, so you need to indent the in a bit more to avoid it.


Note however that this usage is common enough that do provides a  
shorthand:  you can simply omit the in, and let will be parsed  
as if it were a statement:


 main = do
   gen - getStdGen
   let (randNumber, newGen) = randomR (1,6) gen :: (Int,StdGen)
   putStrLn $ Number is  ++ show randNumber

--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allb...@kf8nh.com
system administrator [openafs,heimdal,too many hats] allb...@ece.cmu.edu
electrical and computer engineering, carnegie mellon university 
KF8NH




___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Let it be

2009-10-08 Thread Felipe Lessa
On Thu, Oct 8, 2009 at 2:07 PM, Ross Mellgren rmm-hask...@z.odi.ac wrote:
 there is at least one ticket in Haskell' to fix it for if/then/else

...and there isn't one for let/in because you can use just let
(without in) inside a do-block.  Of course the meanings are different
as in the first case the let-bound variables scope only the 'in ...'
part, while without in it scopes the rest of the do block:

do {ini; let ... in ...; rest}  =  ini  (let ... in ...)  rest
do {ini; let ...; ...; rest}  =  ini  (let ... in (...  rest))

HTH,

--
Felipe.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Libraries for Commercial Users

2009-10-08 Thread Don Stewart
john:
   * Haskell interfaces to Twitter, Facebook, MySpace, Google, etc.

This one is fine:

 twitter
hs-twitter library: Haskell binding to the Twitter API
 del.icio.us
delicious library: Accessing the del.icio.us APIs from Haskell (v2) 
 friendfeed
ffeed library and programs: Haskell binding to the FriendFeed API
 LiveJournal
feed2lj program: Cross-post any RSS/Atom feed to LiveJournal
 flickr
flickr library and programs: Haskell binding to the Flickr API
 amazon
hS3 library and program: Interface to Amazon's Simple Storage Service 
(S3)
 mediawiki
mediawiki library and programs: Interfacing with the MediaWiki API
 google pubsub
pubsub library and programs: A library for Google/SixApart pubsub hub 
interaction
 

Speaking of REST,

 RESTng library: A framework for writing RESTful applications.

And auth:

 WindowsLive
 windowslive library and program: Implements Windows Live Web 
Authentication and Delegated Authentication
 OpenID
openid library: An implementation of the OpenID-2.0 spec.
 OAuth
hoauth library and program: A Haskell implementation of OAuth 1.0a 
protocol.


We've obviously not all there yet, but we have a way to get there --
write and improve code on Hackage. Galois is doing its part (we've
released dozens of web packages), but the other commercial users need to
help out too.

Join the Industrial Haskell Group and fund open source work. Or, if you
can, release some of the non-IP-encumbered things you work on!


-- Don
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Libraries for Commercial Users

2009-10-08 Thread John A. De Goes


Some of these are not ready for production use; e.g.: RESTng: RESTng  
is still experimental and incomplete. It has no documentation and  
doesn't even compile. Sadly typical.


It's a bit of a chicken and egg thing. I'd switch to Haskell in a  
commercial setting if there were more good libraries, yet the act of  
switching would lead to the production of more good libraries. The  
latter, though, is cost-prohibitive, given all the components that  
would need to be developed. A few years from now, or post Haskell-on- 
JVM, I might be singing a different tune.


I do greatly admire the work you and your company have done for Haskell.

What has the Industrial Haskell group done so far? I haven't seen any  
announcements. The work I'd be most interested in helping co-sponsor  
is Haskell on JVM (biggest bang for the buck).


Regards,

John A. De Goes
N-Brain, Inc.
The Evolution of Collaboration

http://www.n-brain.net|877-376-2724 x 101

On Oct 8, 2009, at 11:24 AM, Don Stewart wrote:


john:

* Haskell interfaces to Twitter, Facebook, MySpace, Google, etc.


This one is fine:

twitter
   hs-twitter library: Haskell binding to the Twitter API
del.icio.us
   delicious library: Accessing the del.icio.us APIs from  
Haskell (v2)

friendfeed
   ffeed library and programs: Haskell binding to the FriendFeed  
API

LiveJournal
   feed2lj program: Cross-post any RSS/Atom feed to LiveJournal
flickr
   flickr library and programs: Haskell binding to the Flickr API
amazon
   hS3 library and program: Interface to Amazon's Simple Storage  
Service (S3)

mediawiki
   mediawiki library and programs: Interfacing with the  
MediaWiki API

google pubsub
   pubsub library and programs: A library for Google/SixApart  
pubsub hub interaction



Speaking of REST,

RESTng library: A framework for writing RESTful applications.

And auth:

WindowsLive
windowslive library and program: Implements Windows Live Web  
Authentication and Delegated Authentication

OpenID
   openid library: An implementation of the OpenID-2.0 spec.
OAuth
   hoauth library and program: A Haskell implementation of OAuth  
1.0a protocol.



We've obviously not all there yet, but we have a way to get there --
write and improve code on Hackage. Galois is doing its part (we've
released dozens of web packages), but the other commercial users  
need to

help out too.

Join the Industrial Haskell Group and fund open source work. Or, if  
you

can, release some of the non-IP-encumbered things you work on!


-- Don


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Libraries for Commercial Users

2009-10-08 Thread Don Stewart
The IHG (http://industry.haskell.org/) has funded about 6 months worth
of development so far. You can see the status report here:

http://industry.haskell.org/status

Dynamic libraries, GMP-less GHC, and efficient Cabal, all appearing in
the GHC 6.12.

The IHG is designed as a mechanism whereby commerical users can ensure
the toolchain they depend on is around for the long haul, or kick
towards key features that would enable them to use Haskell in new ways.

I think it is the best mechanism we have for commerical users to work on
shared infrastructure -- stuff that benefits us all.


john:

 Some of these are not ready for production use; e.g.: RESTng: RESTng is 
 still experimental and incomplete. It has no documentation and doesn't 
 even compile. Sadly typical.

 It's a bit of a chicken and egg thing. I'd switch to Haskell in a  
 commercial setting if there were more good libraries, yet the act of  
 switching would lead to the production of more good libraries. The  
 latter, though, is cost-prohibitive, given all the components that would 
 need to be developed. A few years from now, or post Haskell-on-JVM, I 
 might be singing a different tune.

 I do greatly admire the work you and your company have done for Haskell.

 What has the Industrial Haskell group done so far? I haven't seen any  
 announcements. The work I'd be most interested in helping co-sponsor is 
 Haskell on JVM (biggest bang for the buck).

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Any example of concurrent haskell application?

2009-10-08 Thread Daryoush Mehrtash
I am trying to learn more about concurrent applications in Haskell by
studying an existing a real application source code.   I would very much
appreciate if you can recommend an application that you feel has done a good
job in implementing a real time application in Haskell.

Daryoush
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Any example of concurrent haskell application?

2009-10-08 Thread Don Stewart
dmehrtash:
 I am trying to learn more about concurrent applications in Haskell by studying
 an existing a real application source code.   I would very much appreciate if
 you can recommend an application that you feel has done a good job in
 implementing a real time application in Haskell.
 

hmp3 uses a read thread to reduce user input latency. Lambdabot is an
IRC gateway that forks a thread for every message. hyena is a heavily
concurrent web server. All on Hackage.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Libraries for Commercial Users

2009-10-08 Thread Gregory Crosswhite
Out of curiosity, why do you think that porting Haskell to the JVM  
would make such a large difference?  Haskell can already interface  
with C libraries;  are there really so many commercially vital  
libraries that are JVM-only?


Cheers,
Greg


On Oct 8, 2009, at 11:08 AM, John A. De Goes wrote:



Some of these are not ready for production use; e.g.: RESTng:  
RESTng is still experimental and incomplete. It has no  
documentation and doesn't even compile. Sadly typical.


It's a bit of a chicken and egg thing. I'd switch to Haskell in a  
commercial setting if there were more good libraries, yet the act of  
switching would lead to the production of more good libraries. The  
latter, though, is cost-prohibitive, given all the components that  
would need to be developed. A few years from now, or post Haskell-on- 
JVM, I might be singing a different tune.


I do greatly admire the work you and your company have done for  
Haskell.


What has the Industrial Haskell group done so far? I haven't seen  
any announcements. The work I'd be most interested in helping co- 
sponsor is Haskell on JVM (biggest bang for the buck).


Regards,

John A. De Goes
N-Brain, Inc.
The Evolution of Collaboration

http://www.n-brain.net|877-376-2724 x 101

On Oct 8, 2009, at 11:24 AM, Don Stewart wrote:


john:

* Haskell interfaces to Twitter, Facebook, MySpace, Google, etc.


This one is fine:

twitter
  hs-twitter library: Haskell binding to the Twitter API
del.icio.us
  delicious library: Accessing the del.icio.us APIs from  
Haskell (v2)

friendfeed
  ffeed library and programs: Haskell binding to the FriendFeed  
API

LiveJournal
  feed2lj program: Cross-post any RSS/Atom feed to LiveJournal
flickr
  flickr library and programs: Haskell binding to the Flickr API
amazon
  hS3 library and program: Interface to Amazon's Simple Storage  
Service (S3)

mediawiki
  mediawiki library and programs: Interfacing with the  
MediaWiki API

google pubsub
  pubsub library and programs: A library for Google/SixApart  
pubsub hub interaction



Speaking of REST,

RESTng library: A framework for writing RESTful applications.

And auth:

WindowsLive
   windowslive library and program: Implements Windows Live Web  
Authentication and Delegated Authentication

OpenID
  openid library: An implementation of the OpenID-2.0 spec.
OAuth
  hoauth library and program: A Haskell implementation of OAuth  
1.0a protocol.



We've obviously not all there yet, but we have a way to get there --
write and improve code on Hackage. Galois is doing its part (we've
released dozens of web packages), but the other commercial users  
need to

help out too.

Join the Industrial Haskell Group and fund open source work. Or, if  
you

can, release some of the non-IP-encumbered things you work on!


-- Don


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Libraries for Commercial Users

2009-10-08 Thread John A. De Goes


Yes. C is the language of operating systems and browsers and low-level  
system utilities -- not, by and large, the backbone of today's web  
applications. Projects written in C/C++ tend to be ignored in favor of  
those written in Java (Hypertable versus HBase, for example). There  
are exceptions, but there are fewer of them over time. Java's spot in  
the middle tier has overflowed into the bottom tier, as performance  
and community size have increased.


Moreover, C libraries are seldom cross-platform (leading to wasteful  
fiddling and endless frustration), and they are painful to interface  
with due to the requirement for detailed type annotations, which are  
easy to get wrong. JVM is cross-platform, and contains sufficient  
typing information to permit one to write something like, import  
foreign jvm java.list.Collection, and have typed access to the whole  
class and all of its methods.


Regards,

John A. De Goes
N-Brain, Inc.
The Evolution of Collaboration

http://www.n-brain.net|877-376-2724 x 101

On Oct 8, 2009, at 1:00 PM, Gregory Crosswhite wrote:

Out of curiosity, why do you think that porting Haskell to the JVM  
would make such a large difference?  Haskell can already interface  
with C libraries;  are there really so many commercially vital  
libraries that are JVM-only?


Cheers,
Greg


On Oct 8, 2009, at 11:08 AM, John A. De Goes wrote:



Some of these are not ready for production use; e.g.: RESTng:  
RESTng is still experimental and incomplete. It has no  
documentation and doesn't even compile. Sadly typical.


It's a bit of a chicken and egg thing. I'd switch to Haskell in a  
commercial setting if there were more good libraries, yet the act  
of switching would lead to the production of more good libraries.  
The latter, though, is cost-prohibitive, given all the components  
that would need to be developed. A few years from now, or post  
Haskell-on-JVM, I might be singing a different tune.


I do greatly admire the work you and your company have done for  
Haskell.


What has the Industrial Haskell group done so far? I haven't seen  
any announcements. The work I'd be most interested in helping co- 
sponsor is Haskell on JVM (biggest bang for the buck).


Regards,

John A. De Goes
N-Brain, Inc.
The Evolution of Collaboration

http://www.n-brain.net|877-376-2724 x 101

On Oct 8, 2009, at 11:24 AM, Don Stewart wrote:


john:

* Haskell interfaces to Twitter, Facebook, MySpace, Google, etc.


This one is fine:

twitter
 hs-twitter library: Haskell binding to the Twitter API
del.icio.us
 delicious library: Accessing the del.icio.us APIs from  
Haskell (v2)

friendfeed
 ffeed library and programs: Haskell binding to the FriendFeed  
API

LiveJournal
 feed2lj program: Cross-post any RSS/Atom feed to LiveJournal
flickr
 flickr library and programs: Haskell binding to the Flickr API
amazon
 hS3 library and program: Interface to Amazon's Simple Storage  
Service (S3)

mediawiki
 mediawiki library and programs: Interfacing with the  
MediaWiki API

google pubsub
 pubsub library and programs: A library for Google/SixApart  
pubsub hub interaction



Speaking of REST,

RESTng library: A framework for writing RESTful applications.

And auth:

WindowsLive
  windowslive library and program: Implements Windows Live Web  
Authentication and Delegated Authentication

OpenID
 openid library: An implementation of the OpenID-2.0 spec.
OAuth
 hoauth library and program: A Haskell implementation of OAuth  
1.0a protocol.



We've obviously not all there yet, but we have a way to get there --
write and improve code on Hackage. Galois is doing its part (we've
released dozens of web packages), but the other commercial users  
need to

help out too.

Join the Industrial Haskell Group and fund open source work. Or,  
if you

can, release some of the non-IP-encumbered things you work on!


-- Don


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe




___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Generalizing IO

2009-10-08 Thread Andrew Coppin

Heinrich Apfelmus wrote:

Alternatively, you can use algebraic data types instead of type classes
to generalize one program to different implementations. For monads, this
can be achieved with

 http://hackage.haskell.org/package/MonadPrompt

In particular, the idea is to turn every effect like

  getLine

into a constructor

  GetLine

and have different implementations pattern match on that.
  


Ooo, that's interesting...

I did wonder for a moment whether this would allow you to analyse what 
the monadic action does without actually doing it, but on reflection 
this is fundamentally impossible. The action that happens next can (and 
often does) depend on the result of a previous effect.


I guess if you wanted to run your action through an optimiser before 
actually running it, you'd need to use arrows (and all the terrifying 
syntax that entails)...


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Re: Generalizing IO

2009-10-08 Thread Luke Palmer
On Thu, Oct 8, 2009 at 1:42 PM, Andrew Coppin
andrewcop...@btinternet.com wrote:
 Heinrich Apfelmus wrote:

 Alternatively, you can use algebraic data types instead of type classes
 to generalize one program to different implementations. For monads, this
 can be achieved with

     http://hackage.haskell.org/package/MonadPrompt

 In particular, the idea is to turn every effect like

  getLine

 into a constructor

  GetLine

 and have different implementations pattern match on that.


 Ooo, that's interesting...

 I did wonder for a moment whether this would allow you to analyse what the
 monadic action does without actually doing it, but on reflection this is
 fundamentally impossible. The action that happens next can (and often does)
 depend on the result of a previous effect.

 I guess if you wanted to run your action through an optimiser before
 actually running it, you'd need to use arrows (and all the terrifying syntax
 that entails)...

Or Applicatives, or some other action algebra which is appropriate for
the kind of actions you are trying to encode.  Don't fool yourself
into thinking that Monads and Arrows are all there are; those are just
two formalisms for which we have discovered a lot of uses.  But if
what you're trying to encode doesn't match those, then don't use them.
  If you want to encode actions that can be optimized before usage,
expose just enough so you can find the information you need to
optimize it.

Luke
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] New seed. New random number. Right? Wrong.

2009-10-08 Thread michael rice
I'm entering a new number to make a different seed for my generator each time 
through the loop, but my resulting numbers are anything but random.

Where am I going wrong?

Michael 

=

import System.Random
import Control.Monad(when)

main = do
  numberString - getLine
  when (not $ null numberString) $ do
    let seed = read numberString
    let (randNumber, newGen) = randomR (1,6) (mkStdGen seed) :: (Int, StdGen)
  in putStrLn $ Number is  ++ show randNumber
    main 
  
=

[mich...@localhost ~]$ runhaskell zz.hs
12317
Number is 6
12371
Number is 6
37829
Number is 6
8713
Number is 6
71392
Number is 5
29492
Number is 6
41089
Number is 6
28483
Number is 6
78687
Number is 5
40703
Number is 6
86910
Number is 5
15608
Number is 6
56155
Number is 5
31575
Number is 6
72231
Number is 5
51815
Number is 6
20189
Number is 6
71533
Number is 5
17755
Number is 6
91161
Number is 5

[mich...@localhost ~]$ 




  ___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] difference cabal configure and runghc Setup.lhs configure

2009-10-08 Thread andy morris
2009/10/8 Andrew U. Frank fr...@geoinfo.tuwien.ac.at:
 i have a strange error, which does not occur when i run
 runghc Setup.lhs configure
 but when i use cabal configure and then build, it occurs.

 the error is
 Type constructor Control.Exception.Exception used as a class
 in the instance declaration.
 (i have imported qualified Control.Exception)

 two questions:
 1. Exception is a class (in Control.Exception) - why the error?
 2. why is there a difference between runghc and cabal (using the same cabal
 file).

 i attach the cabal file and the two configuratin files produced.


 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe



C.E.Exception used to be a type instead of a class, so you need to
have `base == 4.*` instead of `base -any`. Alternatively, use the
extensible-extensions package instead.

The difference in results you found is because cabal-install uses
base-3 if you don't specify otherwise. The reason for this is that a
lot of packages use `base -any` when they shouldn't: base-4 brought
enough incompatible changes (like making Exception a class) that they
don't work with it. (This is also, I assume, why GHC has two built-in
versions of base in the first place.)
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] New seed. New random number. Right? Wrong.

2009-10-08 Thread Peter Verswyvelen
interesting.
the sequences you get are random, but unless you enter a new number that is
really far from the previous one, the probability of getting the same first
random number seems high.

import System.Random
import Control.Monad(when)

main = do
  numberString - getLine
  when (not $ null numberString) $ do
let seed = read numberString
let randNumbers = take 10 . randomRs (1::Int,6) $ mkStdGen seed
  in putStrLn $ Numbers are  ++ show randNumbers
main

1
Numbers are [6,5,2,6,5,2,3,2,5,5]
1000
Numbers are [6,4,3,2,6,5,2,3,3,5]
100
Numbers are [6,4,3,6,5,5,3,4,6,4]
10
Numbers are [4,1,3,4,6,1,2,4,1,6]
1
Numbers are [1,2,3,3,5,5,4,6,6,4]
1000
Numbers are [1,4,2,6,6,2,4,2,6,5]



On Thu, Oct 8, 2009 at 10:15 PM, michael rice nowg...@yahoo.com wrote:

 I'm entering a new number to make a different seed for my generator each
 time through the loop, but my resulting numbers are anything but random.

 Where am I going wrong?

 Michael

 =

 import System.Random
 import Control.Monad(when)

 main = do
   numberString - getLine
   when (not $ null numberString) $ do
 let seed = read numberString
 let (randNumber, newGen) = randomR (1,6) (mkStdGen seed) :: (Int,
 StdGen)
   in putStrLn $ Number is  ++ show randNumber
 main

 =

 [mich...@localhost ~]$ runhaskell zz.hs
 12317
 Number is 6
 12371
 Number is 6
 37829
 Number is 6
 8713
 Number is 6
 71392
 Number is 5
 29492
 Number is 6
 41089
 Number is 6
 28483
 Number is 6
 78687
 Number is 5
 40703
 Number is 6
 86910
 Number is 5
 15608
 Number is 6
 56155
 Number is 5
 31575
 Number is 6
 72231
 Number is 5
 51815
 Number is 6
 20189
 Number is 6
 71533
 Number is 5
 17755
 Number is 6
 91161
 Number is 5

 [mich...@localhost ~]$



 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Re: Any example of concurrent haskell application?

2009-10-08 Thread Simon Michael

rss2irc is a small app using two communicating threads, and that much works 
well. The error handling may be quite ideal.

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Hugs Trex for GHC / JHC / UHC / ... ?

2009-10-08 Thread Peter Verswyvelen
I briefly read about Hugs record system Trex, and at first sight this
was really nice!

I know this question was asked a long time ago already, but are there
any plans to add this extension to GHC?

What about the other compilers, like JHC, UHC, etc?

Is it possible to emulate Trex (lots of other record systems exist),
*and* get the same easy to understand errors?

What were the problems with Trex (if any)?

Thanks,
Peter Verswyvelen
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] New seed. New random number. Right? Wrong.

2009-10-08 Thread Bryan O'Sullivan
On Thu, Oct 8, 2009 at 1:15 PM, michael rice nowg...@yahoo.com wrote:


 Where am I going wrong?


Your seeds are all extremely close together. The System.Random PRNG takes a
32-bit seed, but your seeds haven't even got a 17-bit range, so you're
supplying approximately 19 parts per million of the possible range of
entropy. Evidently this PRNG doesn't fare well with such a small amount of
entropy.

Try providing a broader range of seeds, and you'll see better results, e.g.
877554827
3377950428
3850407650
688135636
1134078904
973676998
3178940608
840705211
185598244
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] GPipe example and screenshot

2009-10-08 Thread Tobias Bexelius

I've put a simple GPipe example (including a screenshot) on the haskellwiki 
now, showing off an animated spinning box.

 

You'll find the page here:

http://www.haskell.org/haskellwiki/GPipe

 

Later on, I will add more examples, and also some kind of GPipe-tutorial. Hang 
in there...

 

 

Cheers

Tobias Bexelius

 
  
_
Windows Live: Gör det enklare för dina vänner att se vad du håller på med på 
Facebook.
http://www.microsoft.com/windows/windowslive/see-it-in-action/social-network-basics.aspx?ocid=PID23461::T:WLMTAGL:ON:WL:sv-se:SI_SB_2:092009___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] GPipe example and screenshot

2009-10-08 Thread Jake McArthur

Tobias Bexelius wrote:
I've put a simple GPipe example (including a screenshot) on the 
haskellwiki now, showing off an animated spinning box.


Nice to see Data.Vec.LinAlg.Transform3D! That will be a big help. I'm 
having fun with GPipe. Thanks for the library!


- Jake
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe