csci2041/public-class-repo/Labs/Lab_10_Mar_28.md
Michael Zhang 399845160c
f
2018-01-29 17:35:31 -06:00

4.8 KiB

Lab 10: Lazy Evaluation

CSci 2041: Advanced Programming Principles, Spring 2017

Due: Friday, March 31 at 5:00pm. You should be able to complete this work during lab.

Lab goals

Doing this lab should get you set up to work on the programming portion of Homework 05 as some of the programming tasks in this lab are similar to those in the homework.

Getting started.

Copy the file streams.ml from the public class repository into a new directory named Lab_10. Name the copy of this file lab_10.ml.

Add the following functions to the end of that file. But you should clearly mark the parts of this file that you did not write and attribute them to their author (your instructor) and then indicate where your work starts in the file by adding you name and a comment to this effect.

Read over the contents of this file and test out the various functions by running them so that you understand how these streams work.

Streams

Below you are asked to define a series of values (some are functional values) that lead to the definition of str_105_nats of type string so that it prints out as seen in the following interaction in utop:

utop # print_endline str_105_nats ;;
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
21, 22, 23, 24, 25, 26, 27, 28, 29, 30
31, 32, 33, 34, 35, 36, 37, 38, 39, 40
41, 42, 43, 44, 45, 46, 47, 48, 49, 50
51, 52, 53, 54, 55, 56, 57, 58, 59, 60
61, 62, 63, 64, 65, 66, 67, 68, 69, 70
71, 72, 73, 74, 75, 76, 77, 78, 79, 80
81, 82, 83, 84, 85, 86, 87, 88, 89, 90
91, 92, 93, 94, 95, 96, 97, 98, 99, 100
101, 102, 103, 104, 105
- : unit = ()

natural numbers as strings

First define a function str_from of type int -> string stream. This function has the same behavior as from defined in streams.ml except that the numbers are converted into strings.

For example, take 5 (str_from 10) should evaluate to the string list ["10"; "11"; "12"; "13"; "14"].

Next, define str_nats of type string stream. It corresponds to nats.

The expression take 5 str_nats should evaluat to the string list ["1"; "2"; "3"; "4"; "5"].

a stream of separator strings

In the output above, you'll notice that some numbers are separated by a comma and a space and that others are separated by a newline. You now need to define the stream of strings that are these appropriate separator values.

Write a function separators with the type int -> string -> string stream.

Let's call the first argument n and the second one sep.

This function returns a stream of strings in which the first n elements of the stream are the string sep, and the next one is that string containing a single new line character, that is ("\n"). Then there are n more copies of sep before another string with the newline character. This pattern repeats indefinitely.

For example, the expression take 10 (separators 2 "$$") will evaluate to the following string list

["$$"; "$$"; "\n"; "$$"; "$$"; "\n"; "$$"; "$$"; "\n"; "$$"] 

Keep in mind that the second input to take is a steam, not a list. Only its output is a list.

When you look at the result of the test for this function in your Feedback file on GitHub please note that the newline characters do not appear in the sample output that your expression is supposed to match. That output displays the values and the embedded newline characters just create new lines. But Markdown does not treat newlines as paragraph brakes so the strings just appear mashed together in the output. Just make sure your output of this function looks correct.

Next define the value ten_per_line of type string stream that can be used in the following functions to help create the output of str_105_nats seen above.

alternate

Next, write the function alternate that has the type

'a stream -> 'a stream -> 'a stream

and combines two streams into one by alternating their values. The result of evaluating the expression take 10 (alternate nats (from 100)) is the int list

[1; 100; 2; 101; 3; 102; 4; 103; 5; 104]

the string with 105 natural numbers

Finally, define str_105_nats that as type string and whose value can be seen above.

To this you'll need to combine the functions and values you've defined above, perhaps some from streams.ml, and also either List.fold_left or List.fold_right to fold up some list of strings (that originally came from str_nats and out of a call to separators) into the single string seen above.

Note that the newline characters don't appear in the output in the Feedback file on GitHub for the test for str_105_nats either. Just make sure that your output looks like the example above and that there are now extra spaces except as part of the "comma and space" separator value passed into your function separators.