Functional Programming (H)

1. What is the difference between an expression and a statement in an imperative programming language

2. What is the result of the following expression in Haskell, where sqrt returns the square root of its argument:

sqrt 16+9

3. What is the result of the following expression in Haskell, where sqrt returns the square root of its argument:

sqrt (16+9)

4. Give one reason why the following code is incorrect in Haskell:

x = 4 x = ((x * 2))

5. What is the result of the expression abs -6 in Haskell, where abs returns the absolute value of its argument.

6. In Haskell, what is another appropriate name for this style of expression:

n = n + 1

7. Is it valid to write n = n + 1 in Haskell

8. Does the evaluation order of Haskell sub-expressions affect the overall value of the expression?

9. 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

10. Given the definition:

sum_ratio = \x y z -> (x + y) / z

then what is the value of:

1 + 4* sum_ratio 4 2 3

11. What does the following expression evaluate to?

['a','d' .. 'z']

12. Given a list xs, what does the following expression evaluate to?

[]++xs == xs++[]

13. What is the value of this expression?

let x = 5 in x == 5

14. Which one of the following expressions should always evaluate to True?

15. What’s wrong with the following Haskell expression?

if (1) then "true" else "false"

16. Which one of the following expressions does not evaluate to 42?

17. Given these definitions:

a = "england" b = "scotland"

then which one of the following expressions has the greatest integer value?

18. What is wrong with this line of code, to return the number of characters typed by a user?

let x = getLine in length(x)

19. What is the type of this function?

f name = putStrLn ("hello " ++ name)

20. How do you find the type of a defined function f in ghci?

21. What is the difference between -> and <- in Haskell syntax?

22. Why do you think the generation and use of pseudo-random numbers might occur inside a monad?

23. A recursive function must have at least two cases. What are these called?

24. 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)

25. What is the effect of the following fold?

foldl (\acc elt -> acc++[elt]) "" "A string"

26. What is the wrong with the following map/fold-based computation?

foldl (+) (map (*2) [1..8])

27. What is the result of the following computation?

foldr (/) 1 [2,4,8]

28. What is the result of the following computation?

foldl (/) 16 [8,4,2,1]

29.
let x = y + 2 y = x/3 in x+y

This code defines a pair of simultaneous equations. Will this work in Haskell?

30. How do we generate an infinite list of integer 1 values?

31. 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

32. 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?

33. Select which one of the following two let expressions will evaluate to the String

"prime minister"

34. 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"

35. Which one of the following functions will not loop infinitely, if we evaluate it in ghci?

36. 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?

37. 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.)

38. Does the following expression terminate?

let bot = bot bottomList = repeat bot in length(take 5 bottomList)

39. What is the type of the head function?

40. What is the type of the putStrLn function?

41. 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?

42. What is the type of the following function:

\f -> f f

43. Complete the following type definition to define a binary tree with the values stored only in the leaf nodes:

data Tree a = Node __ __ | Leaf __

44. What is the type of the following function (use a,b,c etc as type variables in order of occurence):

\x y -> y

45. Is the following expression correctly typed?

sq :: Int -> Float sq x = x*x

46. Is the following expression correctly typed?

join :: String -> [String] -> String join str strs = foldl (++) str strs

47. What is the result of evaluation of the following expression?

(\x y -> x*x-y*y) 3 4

48. What is the result of evaluating the following expression?

map (\x -> length x) ["This","is", "a","test"]

49. What is the result of evaluating the following expression?

(\x -> (\y -> y x)) "x" (\y -> y)

50. What is the result of evaluating the following expression?

(\x -> (\y -> x y)) "x"

51. What is the result of evaluating the following expression?

(\x f -> f x) 4 (\x -> x*x)

52. What is the result of evaluating the following expression?

(\x -> 1) 2

This quiz is about the Parser parser combinator library. You will be asked to complete some code for each question. First study the code below in detail. It provides the data type for a parser of the JSON format used in JavaScript.

module JSONTypes ( JValue(..), mkJPair, mkJObj ) where import Data.Map hiding ( map ) type JMap = Data.Map.Map String JValue data JValue = JString String | JNumber Integer | JObject JMap | JArray [JValue] | JBool Bool | JNull deriving (Show) mkJPair k v = JObject (Data.Map.singleton k v) mkJObj :: [JValue] -> JValue mkJObj j_vals = let list_of_maps = map (\(JObject pair) -> pair) j_vals combined_map = Data.Map.unions list_of_maps in JObject combined_map

53. What is the type of the function json_parser?

json_parser :: Parser __ json_parser = do whiteSpace j_top <- ( json_array_parser <|> json_obj_parser) return j_top

54. A JSON array consists of a comma-separated list of JSON values enclosed by braces, e.g.

[ 1, 'two', [ 3, true] ]

To parse this format we use the function json_array_parser below. What is the correct data constructor for the return value?

json_array_parser :: Parser JValue json_array_parser = do j_vals <- brackets $ commaSep json_value_parser return $ __ j_vals

55. The JSON format supports boolean values, named true and false.

In the boolean JSON value parser below, what is the missing combinator?

json_bool_parser = do bstr <- ( symbol "true" __ symbol "false" ) let bval = if bstr == "true" then True else False return $ JBool bval

56. A JSON object is a list of key-value pairs, where the key is a string and the value a JSON value, enclosed in braces, e.g.

{ "Street" : "Lilybank Gardens", "Nr" : 18, "Org" : [ "University of Glasgow", { "School" : "Computing Science"} ] }

The most general JValue parser is json_value_parser, which is built of parsers for specific JSON values:

json_value_parser = json_array_parser <|> json_obj_parser <|> json_string_parser <|> json_number_parser <|> json_bool_parser <|> json_null_parser

In the JSON pair parser below, provide the name of the parser for the ‘value’ part of the pair

json_pair_parser = do k <- stringLiteral colon v <- __ return $ mkJPair k v

57. In the JSON object parser below, complete the return expression.

json_obj_parser :: Parser JValue json_obj_parser = do j_vals <- braces $ commaSep json_pair_parser -- a list of pairs return $ __ j_vals

58. Given the following parser:

yin_yang :: Parser String yin_yang = do xs <- string "yin" <|> string "yang" return xs

With the definition as above this parser will fail when trying to parse “yang”:

*Main> run yin_yang "yang" parse error at (line 1, column 1): unexpected "a" expecting "yin"

How should you modify the parser so that it will work correctly?