I believe that from Scheme to Haskell is a natural transition, as I
made the same transition myself. If you grasp the fundamental concepts
of Scheme, Haskell seems like a step up. I will describe Haskell in
terms of Scheme:

# Haskell programs are more correct from the ground up

Scheme will let you write (+ 2 "2") and only tell you that it's wrong
when it tries to run it ("You can't add a number and a string!"),
whereas Haskell won't even let you run it until the types are correct.
What some find difficult is ``1'' has type Num a => a, which means
"for all types a that are Numbers, a" (or just "all Number types"),
e.g. Integer, Double, Rational, etc. But this concept is found Scheme
-- in Scheme you have all sorts of number types; ``+'' means "add two
numbers". In Haskell, we specify that notion explicitly.

# Haskell is half wordy as Scheme

Indeed, that is what drew me to Haskell away from Scheme.

## Problem 1

Consider the problem ``Double all the numbers in a list." In Scheme we
might solve this problem like so:

    (map (lambda (n) (* n 2)) '(1 2 3 4)

and the result would be (2 4 6).

In Haskell, we can write the same:

    map (\n -> n * 2) [1,2,3,4]

and the result would be [2,4,6].

But we take it one step further:

map (*2) [1,2,3,4]

This means the same as the previous Haskell example. But the formal
parameter ``x'' has been tripped away because it is redundant.

## Problem 2

Another problem, ``Given a list of lists, reverse all the lists and
double each number in them.'' So in Scheme, we might solve this like
so:

    (map (lambda (list)
                   (reverse (map (lambda (n) (* n 2)) list)))
             '(1 2 3 4 5))

In Haskell, the same solution is rendered thusly:

    map (reverse . map (*2)) [1,2,3,4]

The ``foo . bar'' is equivalent to (\x -> foo (bar x)), or, in Scheme
(lambda (x) (foo (bar x))). It's just that we have stripped the
redundant formal parameters.

## Problem 3

Suppose our problem is ``Multiply the first three items of a list''.
Our Scheme solution might be:

    (define (first-three-sum list) (* (car list) (cadr list) (caddr list)))

In Haskell, we may write (admittedly, a better way to render this
might be: firstThreeSum = sum . take 3):

    firstThreeSum (x:y:z:_) = x * y * z

Here I have demonstrated pattern matching, a powerful and oft-used
feature of Haskell for deconstructing a data structure, like a list or
a tuple, based on a pattern.

I'll abruptly stop here before I write a whole article. I'll summarize
by saying that Haskell is the next step, a natural progression where
things that you know all too well from Scheme become easier, and
safer. The stuff described here is just the tip of the ice burg, of
course. I wish that I had learned Haskell as my first programming
language! Haskell takes a lot of effort to learn, but gives back in
equal amounts. It is a rough ride to learn any programming language.
If you think otherwise, you are not learning, or are learning wrongly.

2009/7/14 Simon Peyton-Jones <simo...@microsoft.com>
>
> Haskell is a great language!  Check out haskell.org.   I'm ccing the Haskell 
> Cafe which is read by many people better qualified to answer your question 
> than me.   (Since I've been working on Haskell for many years, I am not well 
> qualified to say how it seems to a beginner.)
>
> S
>
> | -----Original Message-----
> | From: Charles Turner [mailto:charlie.h.tur...@googlemail.com]
> | Sent: 11 July 2009 22:52
> | To: Simon Peyton-Jones
> | Subject: Haskell as a first language?
> |
> | I'll make this short! Do you think Haskell is a good language to start
> | with? I am brand new to programming and have been using Scheme, some of
> | my peers suggest I should use Haskell. It seems "professional" to me.
> | Has features that a beginner should not worry about. What would you
> | suggest. (I'm not worried about bias)
> |
> | Thank you very much for your time.
> |
> | Charles Turner.
>
> _______________________________________________
> 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

Reply via email to