
On Fri, 2010-03-05 at 01:42 -0700, Luke Palmer wrote:
On Fri, Mar 5, 2010 at 12:53 AM, Kevin Jardine
wrote: I'm a Haskell newbie but long time open source developer and I've been following this thread with some interest.
The GPL is not just a license - it is a form of social engineering and social contract. The idea if I use the GPL is that I am releasing free and open source software to the community. You are welcome to use it for any purpose but in exchange you must also agree to release any software you create that uses my software as free and open source.
That is the difference between GPL and BSD type licenses. The GPL very deliberately creates an obligation. Yes, that can be inconvenient. It is meant to be inconvenient.
Actually the GPL reminds me of a Haskell concept that I am struggling with right now - the monad. When I started writing Haskell code I was always trying to mix pure and IO code and I soon learned that once I used the IO monad I was stuck within it. The monad creates an inconvenient obligation and any IO code can only be used within other IO code. There are good reasons for monads (just as, in my view, there are good reasons for the GPL) but using them means that I need to make a lot of changes to the way I write software.
Hmm. I believe that there are sufficient loopholes in GPL as library to not use it. Personally I follow such rules of thumb (for myself): - BSD3/MIT/... - Small code or BSD3 community - LGPL - Larger libraries - GPL - Programs BTW. What if package have multiply licenses? Cabal seems to not express following situations: - It is dual licensed - Library is LGPL but helper program is GPL - Part of library is on striker license but part of it is for example public domain (so it would be worth to note this)
Sure. You can put a GPL license on any software:
license :: a -> GPL a
And if you could have used some public domain package 'a' to create some GPL'd software, then you can use the GPL'd 'a' to create that same software.
usage :: (a -> GPL b) -> GPL a -> GPL b
:-P
Luke
Hmm. IMHO it is more similar class Licence l where license :: Package a => a -> l a class Licence l => GPLCompatible l where ... instance GPLCompatible GPL instance GPLCompatible LGPL ... liftToGPL :: (GPLCompatible l, Package a) => l a -> GPL a Regards