Torben Ægidius Mogensen wrote: > There are several aspects relevant to this issue, some of which are: > - Compactness: How much do I have to type to do what I want? ...... > - Naturality: How much effort does it take to convert the concepts of > my problem into the concepts of the language? > - Feedback: Will the language provide sensible feedback when I write > nonsensical things? > - Reuse: How much effort does it take to reuse/change code to solve a > similar problem? .....
I am fairly new to Haskell, but the compactness of the language and the way you can express a lot in a very small amount of real estate is very important.. I used to program back in the 80's in forth a lot.... okay I'm a dinosaur!, but "good" definitions were usually very short, and sweet. Unicon/Icon that I used {still do!} in the imperative world, very compact. I will give an example that covers compact, reusable, and because of static typing when will give back mis-type info when you load a new "a or xs" into it to form a new function. -- what is happening below is a is being replaced with the curried lambda: ((++) 3) and -- xs a list: [1..6], so when that definition of f is used it is type checked to see if the -- elements in xs match the type of a, so if this were going to be compiled, it would -- checked and guaranteed to work. Prelude> :t f f :: forall a b. (Show b) => (a -> b) -> [a] -> IO () Prelude> let f a xs = putStr $ foldr (++) "\n" $ map (((++) "\n"). show . a ) xs Prelude> f ((*) 3) [1..6] 3 6 9 12 15 18 Prelude> another substitution of parameters.. using the same definition of f allowed by the the polymorphic parameters allowed in Haskell add to the versatility and reusability angle: Prelude> f sqrt [0.5,1.0..4] 0.7071067811865476 1.0 1.224744871391589 1.4142135623730951 1.5811388300841898 1.7320508075688772 1.8708286933869707 2.0 Same function 'f" now used with a different type.. [0.5,1.0..4] :: forall a. (Fractional a, Enum a) => [a] I don't know, but this just makes programming fun, for me anyway, and if it is fun, it is expressive.. I've heard this statement made about Ruby and Unicon, to name a few... some would say Python.. but it really applies to the functional languages too, with all their strict typing, with the type inference mechanisms, it isn't usually that big a deal.. If you just get into it, and can learn to take some constructive criticism from your compiler, well hey, it is a really patient teacher... you might get frustrated at times.. but the compiler will happily remind you of the same type mis-matches, until you get a handle on some concept and never once complain... Happy Programming to all! -- gene -- http://mail.python.org/mailman/listinfo/python-list