Experience Report: the Next 1100 Haskell Programmers
Total Page:16
File Type:pdf, Size:1020Kb
Experience Report: The Next 1100 Haskell Programmers Jasmin Christian Blanchette Lars Hupel Tobias Nipkow Lars Noschinski Dmitriy Traytel Fakultat¨ fur¨ Informatik, Technische Universitat¨ Munchen,¨ Germany Abstract mathematics, and linear algebra. The information systems students We report on our experience teaching a Haskell-based functional had only had a basic calculus course and were taking discrete programming course to over 1100 students for two winter terms. mathematics in parallel. The dramatis personae in addition to the students were lecturer The syllabus was organized around selected material from various 1 sources. Throughout the terms, we emphasized correctness through Tobias Nipkow, who designed the course, produced the slides, QuickCheck tests and proofs by induction. The submission archi- and gave the lectures; Masters of TAs Lars Noschinski and Lars tecture was coupled with automatic testing, giving students the pos- Hupel, who directed a dozen teaching assistants (TAs) and took sibility to correct mistakes before the deadline. To motivate the stu- care of the overall organization; furthermore the (Co)Masters of dents, we complemented the weekly assignments with an informal Competition Jasmin Blanchette (MC) and Dmitriy Traytel (CoMC), competition and gave away trophies in a award ceremony. who selected competition problems and ranked the solutions. Categories and Subject Descriptors D.1.1 [Programming Tech- 2. Syllabus niques]: Applicative (Functional) Programming; D.3.2 [Program- ming Languages]: Language Classifications—Applicative (func- The second iteration covered the following topics in order. (The tional) languages; K.3.2 [Computers and Education]: Computer first iteration was similar, with a few exceptions discussed below.) and Information Science Education—Computer science education Each topic was the subject of one 90-minute lecture unless other- wise specified. General Terms Algorithms, Languages, Reliability 1. Introduction to functional programming [0.5 lecture] Keywords Haskell, functional programming, induction, testing, 2. Basic Haskell: Bool, QuickCheck, Integer and Int, guarded monads, education, competition, QuickCheck, SmallCheck equations, recursion on numbers, Char, String, tuples 3. Lists: list comprehension, polymorphism, a glimpse of the Pre- 1. Introduction lude, basic type classes (Num, Eq, Ord), pattern matching, re- This paper reports on a mandatory Haskell-based functional pro- cursion on lists (including accumulating parameters and non- gramming course at the Technische Universitat¨ Munchen.¨ In the primitive recursion); scoping rules by example [1.5 lectures] first iteration (winter semester of 2012–2013), there were 619 stu- 4. Proof by structural induction on lists dents enrolled. In the following winter semester (2013–2014), there 5. Higher-order functions: map, filter, foldr, l-abstractions, were 553 students enrolled. The course ran for 15 weeks with extensionality, currying, more Prelude [2 lectures] one 90-minute lecture and one 90-minute tutorial each week. The weekly homework was graded, but the final grade was primarily 6. Type classes [0.5 lecture] determined by the examination. To make the homework more at- 7. Algebraic datatypes: data by example, the general case, Boolean tractive, we coupled it with an informal programming competition. formula case study, structural induction [1.5 lectures] The departmental course description does not prescribe a spe- 8. I/O, including files and web cific functional language but focuses on functional programming 9. Modules: module syntax, data abstraction, correctness proofs in general. In the previous two years, the course had been based on Standard ML. We have a strong ML background ourselves but 10. Case study: Huffman coding chose Haskell because of its simple syntax, large user community, 11. Lazy evaluation and infinite lists real-world appeal, variety of textbooks, and availability of Quick- 12. Complexity and optimization Check [3]. The one feature we could well have done without is lazy 13. Case study: parser combinators evaluation; in fact, we wondered whether it would get in the way. The course was mandatory for computer science (Informatik) Most topics were presented together with examples or smaller and information systems (Wirtschaftsinformatik) students. All had case studies, of which we have only mentioned Boolean formulas. learned Java in their first semester. The computer science students Moreover, two topics kept on recurring: tests (using QuickCheck) had also taken courses on algorithms and data structures, discrete and proofs (by induction). From day one, examples and case studies in class were accom- panied by properties suitable for QuickCheck. Rather than concen- Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed trate all inductive proofs in the lecture about induction, we dis- for profit or commercial advantage and that copies bear this notice and the full citation tributed them over the entire course and appealed to them whenever on the first page. Copyrights for components of this work owned by others than the it was appropriate. A typical example: In a case study, a function author(s) must be honored. Abstracting with credit is permitted. To copy otherwise, or is first defined via map myg . map myf and then optimized to map republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Request permissions from [email protected]. (myg . myf), justified by a proof of map (g . f ) = map g . map f . Haskell’14, September 04–05, 2014, Gothenburg, Sweden. Much of the above material is uncontroversial and part of any Copyright is held by the owner/author(s). Publication rights licensed to ACM. Haskell introduction, but some choices deserve some discussion. ACM 978-1-4503-3041-1/14/09. $15.00. http://dx.doi.org/10.1145/2633357.2633359 1 www21.in.tum.de/teaching/info2/WS1314/slides.pdf Induction. Against our expectations, induction was well under- stood, as the examination confirmed (Section 5). What may have helped is that we gave the students a rigid template for inductions. We went as far as requiring them to prove equations l1 = r1 not by one long chain of equalities l1 = ··· = lm = rn = ··· = r1 but by two reductions l1 = ··· = lm and r1 = ··· = rn. This avoids the strange effect of having to shift to reverse gear halfway through the proof Figure 1. Status page with exercise points (where blue bars denote the student’s points and black markers denote the median of all of l1 = r1. It must be stressed that we considered only structural induction, that we generally did not expect the students to think students) up auxiliary lemmas themselves, and that apart from extensionality 100% and induction all reasoning was purely equational. 2012–2013 In Haskell, there is the additional complication that proofs by 80% 2013–2014 structural induction establish the property only for finite objects. 60% Some authors restrict the scope of their lemmas to finite lists of de- fined elements [15], while others prove reverse (reverse xs) 40% = xs without mentioning that it does not hold for partial or in- 20% finite lists [7]. Although some authors discuss finite partial ob- 0% jects and infinite objects [6, 15], we avoided them in our course— 1 2 3 4 5 6 7 8 9 10 11 12 13 Sheet undefinedness alone is a can of worms that we did not want to open. Hence, we restricted ourselves to a total subset of Haskell in which Figure 2. Homework submissions relative to the number of en- “fast and loose reasoning” [4] is sound. rolled students Input/output and monads. In the first iteration, I/O was covered toward the end of the course because it is connected with the 3. Exercises advanced topic of monads. For much of the course, many students may have had the impression that Haskell is only a glorified pocket Each week we released an exercise sheet with group and homework calculator. Therefore we moved I/O to an earlier point in the course. assignments. The main objective of the homework was to have the We also dropped monads, since the majority had not grasped them. students actually program in Haskell. The submission infrastruc- This was not entirely satisfactory, because a minority of students ture periodically ran automatic tests, giving the students fast feed- had been excited by monads and expressed their disappointment. back and an opportunity to correct mistakes before the deadline. Abstraction functions. In the lecture on modules and data ab- 3.1 Assignments straction, we also showed how to prove correctness of data repre- sentations (e.g., the representation of sets by lists). This requires A typical assignment sheet contained between three and five group an abstraction function from the representation back to the abstract exercises and about as many homework exercises. The group exer- type that must commute with all operations on the type. As the cor- cises were solved in 90-minute tutorial groups. There were 25 or responding homework showed, we failed to convey this. In retro- 26 such groups, each with up to 24 students. Each exercise fo- spect, it is outside the core functional programming syllabus, which cused on a specific concept from the week’s lecture. Many were is why it is absent from all the textbooks. The topic still appeared programming exercises, but some required the students to write briefly in the lecture in the second iteration, but without exercises. QuickCheck tests, carry out proofs, or infer an expression’s type. The homework assignments, to be solved individually, covered Laziness. Haskell’s lazy evaluation strategy and infinite objects the same topics in more depth, sometimes in combination. They played only a very minor role and were introduced only toward were optional, but in the first iteration of the course, the students the end. Initially, we were worried that laziness might confuse who collected at least 40% of the possible points were awarded a students when they accidentally stumble across it before it has been bonus of 0.3 to the final grade, on a scale from 1.0 (≈ A+) to 5.0 introduced, but this was not reported as a problem by any of the (≈ F).