Haskell The Ultimate Beginner's Guide to Learn Haskell Programming Step by Step 1st edition 2020 By Claudia Alves "Programming isn't about what you know; it's about what you can figure out.” - Chris Pine memlnc INTRODUCTION W M H S ? HAT AKES ASKELL PECIAL H H U ? OW IS ASKELL SED W HAT DO YOU NEED TO START STARTING R , S , G ! EADY ET O T HE FIRST SMALL FUNCTIONS A N INTRODUCTION TO THE LISTS T EXAS RANGES I' M AN INTENSIONAL LIST T UPLES CHAPTER I TYPES AND TYPE CLASSES B ELIEVE IN THE TYPE T YPE VARIABLES T (1 ) YPE CLASSES STEP BY STEP ST PART CHAPTER II THE SYNTAX OF FUNCTIONS P ATTERN ADJUSTMENT G , G ! UARDIANS UARDIANS W ? HERE L ET IT BE C ASE EXPRESSIONS CHAPTER III RECURSION H ! ELLO RECURSION T HE IMPRESSIVE MAXIMUM A FEW MORE RECURSIVE FUNCTIONS Q ! UICKSORT T HINKING RECURSIVELY CHAPTER IV HIGHER ORDER FUNCTIONS C URRIFIED FUNCTIONS H IGHER ORDER IN YOUR ORDER A SSOCIATIONS AND FILTERS L AMBDAS F OLDS AND ORIGAMI A $ PPLICATION OF FUNCTIONS WITH C OMPOSITION OF FUNCTIONS CHAPTER V MODULES L OADING MODULES D .L ATA IST D .C ATA HAR D .M ATA AP D .S ATA ET C REATING OUR OWN MODULES CHAPTER VI CREATING OUR OWN TYPES AND TYPE CLASSES I NTRODUCTION TO ALGEBRAIC DATA TYPES R EGISTRATION SYNTAX T YPE PARAMETERS D ERIVED INSTANCES T YPE SYNONYMS R ECURSIVE DATA STRUCTURES T (2 ) YPE CLASSES STEP BY STEP ND PART T Y -N HE ES O TYPE CLASS T HE FUNCTOR TYPE CLASS F AMILIES AND MARTIAL ARTS CHAPTER VII INPUT AND OUTPUT H W ! ELLO ORLD F ILES AND DATA STREAMS C OMMAND LINE PARAMETERS R ANDOMNESS B YTE STRINGS E XCEPTIONS Introduction A balance of flexible and inflexible qualities make Haskell a fascinating programming language to learn and use. First, the Haskell programming language is not named after Eddie Haskell, the sneaky double-dealing neighbor kid in the ancient TV sitcom, Leave It To Beaver. Haskell is named after Haskell Brooks Curry, an American mathematician and logician. If you don't know, logicians create models to describe and define human reasoning, for example, problems in mathematics, computer science, and philosophy. Haskell’s main work was in combinatory logic, a notation designed to eliminate the need for variables in mathematical logic. Combinatory logic captures many key features of computation and, as a result, is useful in computer science. Haskell has three programming languages named after him: Haskell, Brooks, and Curry. Haskell the language is built around functions, useful blocks of code that do specific tasks. They are called and used only when needed. Another interesting feature of functional languages like Haskell: functions are treated as values like integers (numbers) and strings. You can add a function to another function the way you can add an integer to an integer, 1 + 1 or 35 + 53. Perhaps the best way to describe this quality is a spreadsheet: in a cell in the spreadsheet, you can add numbers as well as a combination of functions to work on numbers. For example, you might specify each number in cells 1-10 be added up as a sum. In Excel, at least, you also can use SUMIF to look for a pattern in cells 1-10 and, if the pattern is found, perform an action on any cells with the pattern. What Makes Haskell Special? Technically, Haskell is a general-purpose functional programming language with non-strict semantics and strong static typing. The primary control construct is the function. (Say that fast ten times!) Here's what it means: - Every language has a strategy to evaluate when to process the input arguments used in a call to a function. The simplest strategy is to evaluate the input arguments passed then run the function with the arguments. Non-strict semantics means the input arguments are not evaluated unless the arguments passed into the function are used to evaluate what is in the body of the function. - Programming languages have rules to assign properties — called a type — to the components of the language: variables, functions, expressions, and modules. A type is a general description of possible values the variable, function, expression, or module can store. Typing helps minimize bugs, for example, when a calculation uses a string ("house” or "cat”) instead of a number (2 or 3). Strong static typing evaluates the code before runtime, when the code is static and possibly as code is written. - The order in which statements, instructions and functions are evaluated and executed determines the results of any piece of code. Control constructs define the order of evaluation. Constructs use an initial keyword to flag the type of control structure used. Initial keywords might be "if” or "do” or "loop” while final keywords might be "end if” or "enddo” or "end loop”. Instead of a final keyword, Haskell uses indentation level (tabs) or curly brackets, or a mix, to indicate the end of a control structure. Perhaps what makes Haskell special is how coders have to think when they use the language. Functional programming languages work in very different ways than imperative languages where the coder manages many low-level details of what happens in their code and when. While it is true all languages have things in common, it’s also true languages are mostly functional or mostly imperative, the way people are mostly right handed or left handed. Except functional programming languages require a different way of thinking about software as you code. Other features that make Haskell interesting: - Strong data typing (evaluating properties of all inputs into a function) is combined with polymorphism; a function to sort numbers also can be used to sort strings of text. In some languages, you would have to code two or more functions, one for each data type. - Lazy evaluation (one of my favorite coding terms!) allows the result of one function/task to be handed to another function/task on the same line of code. For example, the command can search a file for all instances of a string then pass the results to be printed to the computer screen. Functions that can take other functions as arguments or return them as results also are called higher order functions. - No side effects. In other languages, code can affect the state of the computer and application, for example, writing to a file. Haskell strictly limits these side effects which, in turn, makes Haskell applications less prone to errors. - Haskell uses monads, a structure that works like an assembly line where every stop on the line performs a different task. This allows Haskell to separate side effects as a distinct activity apart from any function, for example, logging any errors as a function performs tasks on its data inputs. Building from small bits of code, each bit tightly contained and testable. How is Haskell Used?