Hugs Prelude - Hs Main Prelude - Hs Itoa - HS, Exercise1.hs
Hugs Prelude - Hs Main Prelude - Hs Itoa - HS, Exercise1.hs
Evaluating expressions using predened functions and operators and user-dened functions
3, 3.0, 3, "3", etc. sqrt 2.0, sin (pi/2.0), 6 < 4, 3 > 4 && 4 > 3, etc. cube 2, volume, surfaceArea 3
You have a rough idea of what a type is, how it is declared, how a function is dened Let us go into more details...
CA215 Languages and Computability Functional Programming in Haskell
Dening Functions
In Mathematics, a function f associates each member of a set A (the domain of f ) with a single member of a set B (the codomain of f ): f : A B If a A then f (a) is the associated member of B Example: for f : R R dene f (x ) = x 2 Haskell uses this same concept and similar notation, e.g. square :: Float -> Float (type declaration) square x = x^2 (function denition) Less formally, a function gives an output value which depends upon the input value(s) (output meaning result and input(s) meaning argument(s) or parameter(s))
Dening Functions
One notational difference to be aware of is that in Haskell we can write f x (even if it can be confusing at rst) instead of f(x) as the brackets serve no real purpose Suppose you write square x+1; the spacing may suggest square (x+1), but in fact it means (square x)+1 The best way to avoid confusion is just to rembember that function application has higher priority than all other operators (e.g. + or ) and it is left associative Function application is the process of giving particular inputs to a function For example, for addition over numbers (function/operator +), given input values 12 and 10 the corresponding output is 22
Dening Functions
Always chose meaningful names for the functions you dene You can use any sequence of letters, digits, underscores ( ) and primes () except that:
the name must begin with a lowercase letter (names beginning with upper case letters are used for types, modules and constructors) you cannot use a name that has already been used (that includes all the functions in prelude) some names are reserved words, and have a special meaning in Haskell so you cannot use them for any other purpose
Dening Functions
Haskell functions can take more than one argument, for example add :: Int -> Int -> Int add x y = x+y Corresponding expressions are written add 3 4 rather than add(3,4) or add (3,4) The expression add (3,4) is illegal To be able to write such an expression, the function must have a different type and be dened differently Which type and How?
Dening Functions
Haskell functions can take more than one argument, for example add :: Int -> Int -> Int add x y = x+y We write add 3 4 rather than add(3,4) or add (3,4) for function application The expression add (3,4) is illegal To be able to write such an expression, the function must have a different type and be dened differently Which type and How? add :: (Int, Int) -> Int add (x,y) = x+y Now add takes a single argument which is a pair of integers
Built-In Functions
abs ceiling, floor, round sqrt cos, sin, tan acos, asin, atan exp log negate
absolute value rounding up, down or to the closest integer square root trigonometric functions inverse trigonometric functions powers of e logarithm to base e change their sign of a number
A type is a collection of values (a kind of value), like the whole set of integers A function is an operation which takes one or more arguments (inputs, parameters) to produce a result (output) Functions operate over particular types
Function Layout
In any programming language, the layout of progammes is important for their readability In Haskell, layout rules help to get rid of the annoying punctuation used in many other languages (semicolons, braces, begin/end, etc.) Haskell uses indentation to decide the ends of denitions, expressions, and so on Basic rule: A denition ends when a (non-space) symbol appears in the same column as the rst symbol of the denition
Function Layout
cube x = x * x * x answer = 6 * 7 This is correct. The denition of cube ends when the a of answer appears in the same column as the c of cube cube x = x * x * x answer = 6 * 7 This is correct too but harder to read cube x = x * x * x This is wrong. The denition of cube is ended by (before) the equal sign. Hugs will detect this as a syntax error:
ERROR cube.hs:2 - Syntax error in declaration (unexpected ;)
The error message may seem strange: what semicolon? Explanation: denitions may also be ended by ;, so this message is just telling you that the denition ended too soon
CA215 Languages and Computability Functional Programming in Haskell
Function Layout
Some more examples: myMin x y|x<y=x|otherwise=y This is correct but hard to read myMin x y | x < y = x | otherwise = y This is better
Function Layout
cube x = x * x * x answer = 6 * 7 cube x = x * x * x answer = 6 * 7 Both of these are wrong since answer does not line up under cube Note that this must hold even if sections of code are separated by comments
Expression Evaluation
Haskell evaluates an expression by repeatedly performing simplications (or reductions) on the expression until no more reductions can be performed When an expression is fully reduced in this way it is said to be in normal form Examples of the different kinds of reduction are:
replacing a built-in function application with its value ( e.g. sqrt 2) replacing a user-dened function name with its body and substitute the actual parameters into it to replace the corresponding identiers ( e.g. cube 2)