Главная / Программирование /
Функциональное программирование / Тест 30
Функциональное программирование - тест 30
Упражнение 1:
Номер 1
Какого типа выражение <@@ (1+2)*3 @@>
?
Ответ:
 (1) int
 
 (2) int → int
 
 (3) unit → int
 
 (4) Expr
 
Номер 2
Что означает запись <@ fun x→ x*2 @>
?
Ответ:
 (1) создается отложенное вычисление для вычисления функции x*2
 
 (2) создается дерево выражения, описывающего функцию удвоения 
 (3) в данном случае запись эквивалентна fun x → x*2
 
Номер 3
В чем разница между записями <@ fun x→ x*2 @> и fun x→ <@ x*2 @>
?
Ответ:
 (1) первая запись допустима, вторая – нет 
 (2) вторая запись допустима, первая – нет 
 (3) нет разницы 
 (4) в первом случае создается дерево лямбда-выражения, во втором – функция, которая по заданному x возвращает дерево умножения его на 2 
Номер 4
В чем разница между записями <@ fun x→ x*2 @>
и <@@ fun x→x*2 @@>
?
Ответ:
 (1) нет разницы 
 (2) в первом случае производится контроль типов и возвращается типизированное дерево, во втором – безтиповое 
 (3) в первом случае используются энергичные вычисления, во втором – ленивые 
 (4) в данном случае допустима только первая запись 
Упражнение 2:
Номер 1
Что такое монада?
Ответ:
 (1) Механизм реализации ввода-вывода в функциональных языках 
 (2) языковый механизм для расширения системы типов и внесения дополнительных свойств 
 (3) полиморфный монадический тип, для которого определены операции return
и bind
 
 (4) полиморфный монадический тип, для которого определены операции return
и bind
, обладающие определенными свойствами 
Номер 2
Укажите правильное монадическое свойство:
Ответ:
 (1) return x >>= f є f x
 
 (2) return x >>= f є x f
 
 (3) return (f x) >>= g є f(g x)
 
 (4) (return x >>= f) є return (x>>=f)
 
Номер 3
Укажите правильное монадическое свойство:
Ответ:
 (1) m >>= return m є m
 
 (2) f >>= return m є f m
 
 (3) f >>= return m є m f
 
 (4) m >>= return є m
 
Упражнение 3:
Номер 1
Чему равен результат выражения nondet { return 10; }
для монады недетерминированных вычислений?
Ответ:
 (1) 10
 
 (2) [10]
 
 (3) Nondet(10)
 
 (4) Nondet<10>
 
Номер 2
Какого типа выражение async { return 10; }
?
Ответ:
 (1) int
 
 (2) unit → int
 
 (3) Async
 
 (4) Async<int>
 
Номер 3
Как записать выражение для последующего параллельного вычисления значения функции fib
?
Ответ:
 (1) async { fib 100; }
 
 (2) async { return (fib 100); }
 
 (3) return async { fib 100 }
 
 (4) async(fib 100)
 
Упражнение 4:
Номер 1
Как правильно параллельно вычислить сумму 100-го и 200-го чисел Фибоначчи?
Ответ:
 (1) sum(Async.RunSynchronously(Async.Parallel([async { return (fib 100) }, async { return (fib 200) }])))
 
 (2) Async.RunSynchronously(sum(Async.Parallel([async { return (fib 100) }, async { return (fib 200) }])))
 
 (3) Async.Parallel((fib 100)+(fib 200))
 
 (4) Async.Parallel(async { return (fib 100) + (fib 200) })
 
Номер 2
Сколько потоков выполнения операционной системы будет порождаться при выполнении операции Async.RunSynchronously(Async.Parallel([ for i in 1..100 → async { return fib(i) }]))
?
Ответ:
 (1) один 
 (2) менее 100 
 (3) 100 
 (4) 200 
Номер 3
Какие ошибки содержаться в приведенном фрагменте кода?
1 let ProcessImageAsync () =
2 async { let inStream = File.OpenRead(sprintf "Image%d.tmp" i)
3 let pixels = inStream.ReadAsync(numPixels)
4 let pixels' = TransformImage(pixels,i)
5 let outStream = File.OpenWrite(sprintf "Image%d.done" i)
6 do outStream.WriteAsync(pixels') }
Ответ:
 (1) в строке 2 отсутствует восклицательный знак после let
 
 (2) в строке 3 отсутствует восклицательный знак после let
 
 (3) в строке 4 отсутствует восклицательный знак после let
 
 (4) в строке 5 отсутствует восклицательный знак после let
 
 (5) в строке 6 отсутствует восклицательный знак после do