$29
You must use the literal haskell format (.lhs). You should submit ONE lhs file with all questions answered in the file. Name your file "Hw11.lhs".
As usual, this file should be wrapped in a tar.gz directory with your bmail name e.g. "eway1_hw11.tar.gz". Note that there are several questions herein, particularly those that end in "why?". Put the answers to these questions in comments near any associated code.
1. [0pts]Using interactive Haskell.
A. GHCi can be opened on the terminal with
$ ghci
a. Opening ghci will give you a prompt like:
GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help Prelude
Online documentation for the GHC: http://www.haskell.org/haskellwiki/GHC/GHCi http://www.haskell.org/ghc/docs/latest/html/users_guide/ http://www.haskell.org/hoogle/
Online book for Haskell http://learnyouahaskell.com/
Interactive commands are available at the prompt. For the most part, it doesn't matter whether you're using GHCi or Hugs.
The most useful will be:
Prelude :? --List available commands.
Prelude :l MyFile.lhs --Load a file. This supports tab-completion so you don't have to type out the whole file name.
Prelude :r --Reload the last loaded file, if you've edited it somewhere else.
Prelude :e --Open a text editor. Not supported in Hugs.
Prelude :!ls -- :! runs shell commands
Prelude :!pwd
Prelude :cd CS471 --:!cd won't work; you need to use :cd.
Prelude :t factorial --Get the type of an expression.
C. At the prompt type any numerical expressions.
Prelude 3 + 4
Prelude sqrt(25)
Prelude (+) 3 4 --Infix operator as prefix.
Prelude div 10 3
Prelude 10 `div` 3 --Prefix operator as infix.
Prelude (-) 2 5
Prelude (2 - ) 5 --Currying.
Alternation, types, set of types (Classes), type inference and specifying types
PART 2
[5pts]Create a Haskell script file using your favorite editor. We are going to create a program/script using the literal style of coding. Each line of code will begin with " ". DO NOT MIX TABS AND SPACES. Lines with comments can begin with any character except "".
a. The first 2 lines of the file should be:
module Hw11
where
Notice there is a space between "" and module, the identifer "Hw11" begins with a capital.
There can be 1 or more spaces between "" and where.
Line 3 should be a blank line. Enter the following comment on line 4. The comment can start in column 1.
Define factorial. Let Haskell infer the type of factorial.
Enter another blank line. Type the following 1 line definition of factorial. Remember "=" means defined as and "==" is the equals operator. This code uses a if expression. What is the difference between an if statement and an if expression?
factorial n = if n == 0 then 1 else n * factorial (n - 1)
Save text in a file named "Hw11.lhs". Notice the name matches the module name.
Make sure you are in the folder with "Hw11.lhs" and open Hugs or GHCi. At the prompt type:
.... :l Hw11.lhs
Notice the prompt will change to the name of the module
Hw11
f. At the prompt type the expression
Hw11 factorial 5
What do you see? What is the inferred type of factorial? (At the prompt typed :t factorial).
[0pts]Open "Hw11.lhs" in an editor. One way is to type ":e" at the prompt and an editor should open. The symbol/operator "::" means has type. Add the following definitions to the file (Lines 7 -10). (Line
tells Haskell the type of the fact1,
fact1 :: Int - Int
fact1 n = if n == 0 then 1 else n * fact1 (n - 1)
fact2 :: Integer - Integer
fact2 n = if n == 0 then 1 else n * fact2 (n - 1)
Save and reload the script. (:r).
4. [5pts]Lets run some experiments. At the prompt type these expressions:
Hw11 factorial 12
Hw11 fact1 12
Hw11 fact2 12
Hw11 factorial 13
Hw11 fact1 13
Hw11 fact2 13
Hw11 factorial 500
Hw11 fact1 500
Hw11 fact2 500
What happens and why?
[10pts]Lets runs some experiments. At this point you may not understand the inferred types. At the prompt type the following commands:
:t fact1
:t fact1 5
:t (*)
:t (==)
:t 5
:t 5.1
:t 5::Int
:t factorial
:t factorial 5
:t (-)
:t (2-)
:t (-) 2
:t error
:t (2 - ) --Currying.
"Num a" means --- Num is a set of types and a belongs to the set. Examples of types that belong to Num are Int, Integer, Float as well as user defined types. Haskell calls these sets --CLASSES-- At the prompt type the following expressions:
Hw11 factorial (-2)
What happens and why?
At the prompt type the following expressions:
Hw11 factorial -2
What happens?
Edit "Hw11.lhs" again. Instead of using if expression, you will use pattern matching. Noticed that the first definition of factP has "0" instead of an variable. Add the following (lines 11-13):
factP :: Integer - Integer
factP 0 = 1
factP n = n * factP(n -1)
Reload the module and test factP using data from part2 #3
Edit "Hw11.lhs" again. Instead of using if expression, you will use guards. Notice the indentation (spaces between "" the "|" (the guard)). In addition error will be used to catch negative input. Add the following (lines 14-17)
factG x
| x < 0= error "neg x"
| x == 0 = 1
| otherwise = x*factG(x-1)
How many definitions are there? Reload Hw11 and test factG. What happens when you type factG (-2)?
Edit "Hw11.lhs" again. Add the following two definitions (lines 18-27).
factG2 :: Integer - Integer
factG2 n
| n < 0= error "neg n"
| n == 0 = 1
| otherwise = n * factG2 (n - 1)
factE :: Integer - Integer
factE n
| n < 0= error "neg n"
| n == 0 = 1
| otherwise = n * factE n - 1
At the prompt type these expressions:
Hw11 factorial 5.1
Hw11 factG 5.1
Hw11 factG2 5.1
What happens and why?
At the prompt type these expressions:
Hw11 factG2 5
Hw11 factE 5
What happens? Try to guess why factE behaves this way?