Functional Programming (H) - Examinable
1. What is the effect of the following fold?
foldl (\acc elt -> acc++[elt]) "" "A string"
It will return “gnirts Aâ€
It will return the string except its last character
It will return “A stringâ€
2. Does the following expression terminate?
let bot = bot bottomList = repeat bot in length(take 5 bottomList)
no, it loops forever
yes, returning integer value 5
3. Is the following expression correctly typed?
sq :: Int -> Float sq x = x*x
No
Yes
4. In Haskell, what is another appropriate name for this style of expression:
n = n + 1
An assignment
An equation
5. What is the result of the following computation?
foldr (/) 1 [2,4,8]
2.0
0.25
4.0
0.5
6. Given the following type declarations:
f :: T1 -> T2 g :: T2 -> T3
And given that the following expression typechecks:
v :: T1 v = h f g
What is the type of h?
h :: (T3 -> T2) -> (T2 -> T1) -> T3
h :: T3 -> T2 -> T1
h :: T1 -> T2 -> T3
h :: (T1 -> T2) -> (T2 -> T3) -> T1
7. What is the type of this function?
f name = putStrLn ("hello " ++ name)
[Char] -> ()
IO [Char]
[Char] -> IO ()
8. What does the following expression evaluate to?
['a','d' .. 'z']
“adgjmpsvyâ€
“adzâ€
9. Select which one of the following two let expressions will evaluate to the String
"prime minister"
let x = numeral ++ " minister" in x where numeral = "prime"
let x = numeral ++ " minister" where numeral = "prime" in x
10. What is the result of the following computation?
foldl (/) 16 [8,4,2,1]
4.0
2.0
0.25
0.5
11. What is the difference between a named function and a lambda function assigned to a variable? For example:
f x = x + 1 -- or f = \x -> x+1
There is no meaningful difference.
It is less efficient to define functions in terms of lambdas.
12. What is the difference between
->
and
<-
in Haskell syntax?
<-
is for associating names with values in do blocks whereas
->
is used for defining functions.
<-
indicates less than, whereas
->
indicates greater than
they are both two ways of representing the same thing.
13. Why do you think the generation and use of pseudo-random numbers might occur inside a monad?
because it is an interaction with ‘the outside world’
because it is defined in the Haskell Prelude library
because the sequence of pseudo-random numbers is important, and the programmer needs to control it.
14. What is wrong with the following definition of filter?
filter :: (a -> Bool) -> [a] -> [a] filter pred [] = [] filter pred (x:xs) | pred x = x : filter pred xs | otherwise = filter pred (x:xs)
The recursion for the non-matching case should operate on xs, not on (x:xs)
The predicate should operate on xs, not on x
The base case is wrong
The recursion for the matching case should work on (x:xs), not on xs
15. What is the result of evaluation of the following expression?
(\x y -> x*x-y*y) 3 4
-20
-7
20
7
16. A recursive function must have at least two cases. What are these called?
general case and specific case
base case and induction case
base case and general case
17. What is the type of the
putStrLn
function?
putStrLn :: String -> IO ()
putStrLn :: String -> ()
putStrLn :: Show a => a -> IO ()
putStrLn :: Char -> IO ()
18. Is it valid to write
n = n + 1
in Haskell
Yes, it is a valid expression
No, it is a syntax error
19.
let x = y + 2 y = x/3 in x+y
This code defines a pair of simultaneous equations. Will this work in Haskell?
no — it will either fail with an error or loop forever.
yes — it will compute the two values that have mutually recursive definitions
20. What is the type of the following function:
\f -> f f
It is not possible to type this expression correctly in Haskell
Bottom
True
21. Which one of the following expressions generates an infinite list of successive factorial numbers? (Recall that the nth factorial is the product of the first n positive integers.)
facts = [1,2,6,...]
facts = map (\x-> (foldr (*) 1 [1..x])) [1..]
facts = (*) [1..]
22. Given a list xs, what does the following expression evaluate to?
[]++xs == xs++[]
False
True
23. What is the wrong with the following map/fold-based computation?
foldl (+) (map (*2) [1..8])
map should take a function like (*), not (*2)
The map and foldl functions should be swapped
foldl needs an accumulator argument.
24. Study the Haskell function f below. What does f() evaluate to?
f :: () -> String f () = let x = (Just Nothing) in case x of (Just _) -> "something" Nothing -> "nothing"
Nothing
"nothing"
"something"
25. Which one of the following expressions should always evaluate to True?
"haskell" <> "python"
"haskell" < "python"
haskell < python
26. What is the type of the following function (use a,b,c etc as type variables in order of occurence):
\x y -> y
\x y -> y :: a -> a -> a
\x y -> y :: a -> b -> b
\x y -> y :: a -> a -> b
\x y -> y :: a -> b -> c
27. What is the missing case clause in the following definition of a function to calculate the length of a Haskell list?
mylength l = case l of -- MISSING CLAUSE -- x:xs -> 1+mylength xs
[] -> 0
[] <- 0
Null -> 0
28. What is the result of evaluating the following expression?
map (\x -> length x) ["This","is", "a","test"]
4
an error
[4,2,1,4]
29. What is the difference between an expression and a statement in an imperative programming language
Expressions denote small scale computations that return a value
Statements handle sequencing, looping, conditionals, and all the large scale operation of a program
Expressions determine control flow and are often composed of statements
30. How do we generate an infinite list of integer 1 values?
[1..]
repeat 1
[1..1]
take 1
31. What is wrong with this line of code, to return the number of characters typed by a user?
let x = getLine in length(x)
The code associates the name x with the getLine function, rather than receiving a line of input from the user — and we can’t take length of a function.
nothing is wrong — the code should work fine
Because getLine is a function, it needs arguments. There are no arguments given in this code.
the code loops for ever
32. Which one of the following expressions does not evaluate to 42?
(*) 21 2
head (zip [42] [True])
[7,23,42] !! ((+) 1 1)
33. What is the result of evaluating the following expression?
(\x -> 1) 2
2
a type error
1
34. Does the evaluation order of Haskell sub-expressions affect the overall value of the expression?
No, evaluation order does not affect the final value.
If expressions are evaluated in a different order, then the final value might be different.
35. What is the result of evaluating the following expression?
(\x -> (\y -> y x)) "x" (\y -> y)
(\x -> (\y -> y x)) "x"
an error
(\y -> y x) "x"
"x"
36. In a Haskell guard expression, each of the guards evaluates to a Bool value, either True or False. What is the Bool value for the otherwise case?
True
Maybe True
False
37. Given the definition:
sum_ratio = \x y z -> (x + y) / z
then what is the value of:
1 + 4* sum_ratio 4 2 3
9
5
38. Complete the following type definition to define a binary tree with the values stored only in the leaf nodes:
data Tree a = Node __ __ | Leaf __
data Tree a = Node Tree Tree | Leaf
data Tree a = Node a a | Leaf
data Tree a = Node (Tree a) (Tree a) | Leaf a
data Tree a = Node Leaf Leaf | Leaf (Tree a)
39. What is the value of this expression?
let x = 5 in x == 5
True
5
False
40. Given these definitions:
a = "england" b = "scotland"
then which one of the following expressions has the greatest integer value?
length (zip a a)
length (zip a b)
length (zip b b)
41. Which one of the following functions will not loop infinitely, if we evaluate it in ghci?
take 10 [1..]
tail [1..]
length [1..]
42. Is the following expression correctly typed?
join :: String -> [String] -> String join str strs = foldl (++) str strs
No
Yes
43. What is the result of the following expression in Haskell, where sqrt returns the square root of its argument:
sqrt 16+9
5
13
44. What is the type of the
head
function?
head :: a -> a
head :: [a] -> Int
head :: a -> Int
head :: [a] -> a
45. How do you find the type of a defined function f in ghci?
:show f
:type f
:load f
46. What is the result of evaluating the following expression?
(\x f -> f x) 4 (\x -> x*x)
16
a partially applied function
4
47. What is the result of the following expression in Haskell, where sqrt returns the square root of its argument:
sqrt (16+9)
5
13
48. Give one reason why the following code is incorrect in Haskell:
x = 4 x = ((x * 2))
Because you can assign an expression to a name only once
Because there are too many parentheses
49. What’s wrong with the following Haskell expression?
if (1) then "true" else "false"
An endif statement is needed to show the end of the conditional expression
There should not be any brackets around the condition
The condition is incorrectly typed, since it is an integer value
50. What is the result of the expression
abs -6
in Haskell, where abs returns the absolute value of its argument.
6
An error
51. What is the result of evaluating the following expression?
(\x -> (\y -> x y)) "x"
a string value
a type error
a partially applied function
52. Given a Tree data type as defined earlier in the course:
data Tree = Leaf | Node Int Tree Tree deriving Show
with Leaf and Node constructors, then how do we define an infinite tree?
mkInfiniteTree = Node 0 (mkInfiniteTree) (mkInfiniteTree)
mkInfiniteTree = mkInfiniteTree Node 0
mkInfiniteTree = Node 0 (mkInfiniteTree) (mkInfiniteTree)
Submit Quiz