Basic Syntax
You can define a function called "divide" that takes two arguments, divides them, and returns the result.
divide a b = a / b
You invoke the function like this:
two_thirds = divide 2 3
No parens, no commas. Just spaces.
Furthermore, since this is a functional language, you can define functions by simply assigning them from other existing functions.
div = divide
two_thirds = div 2 3
This shouldn't be anything too profound since Python, even JavaScript, can do this.
Now let's make a function that inverts a number:
invert a = divide 1 a
one_half = invert 2
The Confusing Part
Unlike in Python (or any other language I've seen), you can define a function that supplies only some of the arguments to another function.
invert = divide 1
one_half = invert 2
But I thought "divide" took 2 arguments, you might say. It actually doesn't.
How Haskell Works
Every function in Haskell takes exactly 1 argument. To explain this, I'll use Python. Here's the Python equivalent of our divide function from above:
def divide(a):
return lambda b: a / b
Here's how to call our python divide function:
two_thirds = divide(2)(3)
The result of
divide(2)
is a function that takes 1 argument called b
. When it gets b
it divides 2/b
and returns that. All functions in Haskell behave this way.Some Examples
negate a = -a
divide a b = a / b
-- here's a list of numbers:
numbers = [1,2,5,10]
-- the map function takes a function and
-- applies it to each item of a list
negated_numbers = map negate numbers
-- produces: [-1,-2,-5,-10]
-- here's our invert function
invert = divide 1
inverted_numbers = map invert numbers
-- produces: [1, 0.5, 0.2, 0.1]
-- equivalently:
inverted_numbers = map (divide 1) numbers
-- more complex:
-- this function inverts a list of numbers
invert_list = map invert
inverted_numbers = invert_list numbers
Obviously, there's a lot more to Haskell than presented here, but hopefully this helps explain some of the semantics of Haskell I had trouble with when I learned it.
No comments:
Post a Comment