82 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | title: Functional Language | ||
|  | --- | ||
|  | 
 | ||
|  | ## Functional Language
 | ||
|  | 
 | ||
|  | The Erlang language features 'concurrency'. | ||
|  | The part of the language not concerned with 'concurrency' is known as the 'sequential subset'. | ||
|  | This subset is a pragmatic functional programming language. | ||
|  | 
 | ||
|  | #### More Information:
 | ||
|  | <!-- Please add any articles you think might be helpful to read before writing the article --> | ||
|  | 
 | ||
|  |   * [Wikipedia: Erlang Functional Programming Examples](https://en.wikipedia.org/wiki/Erlang_(programming_language)#Functional_programming_examples) | ||
|  |   * [Wikipedia: Functional Programming](https://en.wikipedia.org/wiki/Functional_programming) | ||
|  |   * [Learn You Some Erlang: Types (or lack thereof)](https://learnyousomeerlang.com/types-or-lack-thereof) | ||
|  |   * [Learn You Some Erlang: Module Declaration](https://learnyousomeerlang.com/modules#module-declaration) | ||
|  | 
 | ||
|  | ### Erlang as a Functional Programming Language
 | ||
|  | 
 | ||
|  | The Erlang 'sequential subset' features: | ||
|  | 
 | ||
|  |   * pattern matching | ||
|  |   * a dynamic type system (strongly typed) | ||
|  |   * referential transparency (immutable data) | ||
|  |   * first class and higher order functions | ||
|  |   * pure functions | ||
|  |   * pure data structures | ||
|  |   * recursion | ||
|  |   * strict (aka eager) evaluation | ||
|  |   * runtime garbage collection | ||
|  |   * list comprehensions | ||
|  | 
 | ||
|  | Erlang has no currying, a feature typical of languages that exhibit 'higher order functions'. | ||
|  | 
 | ||
|  | Erlang is a 'pragmatic':  I/O and message passing have side-effects but there is no restriction on where these are used. | ||
|  | So while pure functions are the norm, not all functions in Erlang are pure in the strict sense. | ||
|  | 
 | ||
|  | ### What this means in practice
 | ||
|  | 
 | ||
|  | Most programs are written in 'imperative' or 'procedural' languages. | ||
|  | 
 | ||
|  | Some 'imperative' languages have had 'functional' programming added so programmers | ||
|  | may mix code that follows a functional style with code that follows an imperative style as and when they choose. | ||
|  | This halfway house may make functional programming look 'easy'. | ||
|  | 
 | ||
|  | Erlang does not support the 'imperative style' at all. | ||
|  | Erlang code appears bewildering at first and the idea of writing Erlang code daunting. | ||
|  | 
 | ||
|  | In Erlang you use recursion to express the idea of iteration: | ||
|  | there is no 'for' or 'while' or 'do-while'. | ||
|  | If you think of 'iterate' as what needs to be done and 'for-loop' as simply a way of doing it, | ||
|  | you will able to learn how to use recursion instead. | ||
|  | If you think of 'for-loop' as what needs to be done then you will struggle. | ||
|  | 
 | ||
|  | In practice Erlang functions and programs tend to: | ||
|  | 
 | ||
|  |   * use recursion to do loops | ||
|  |   * use pattern matching and guards to do conditionals | ||
|  |   * do not have state variables | ||
|  | 
 | ||
|  | Erlang uses dynamic typing. | ||
|  | This means you seldom have issues with the compiler telling you cannot do this with that number because it has the wrong number of bits. | ||
|  | Erlang is strongly typed so this does not generally lead to lots of runtime errors. | ||
|  | However, your experience may be different. | ||
|  | 
 | ||
|  | In Erlang variables are immutable. | ||
|  | This is an oxymoron. | ||
|  | You do not assign values to variables in Erlang: | ||
|  | you bind a value to a (variable) name and you can do that only once (per recursion). | ||
|  | 
 | ||
|  | This affects the way functions are written. | ||
|  | You cannot have 'state variables'. | ||
|  | Instead, if you must have state, | ||
|  | it is passed explicitly by using extra parameters to (usually recursive) functions. | ||
|  | 
 | ||
|  | Lists are extremely important data structures in Erlang: | ||
|  | they are analogous to arrays or vectors in other languages. | ||
|  | However, lists cannot be indexed and are generally processed from head to tail. | ||
|  | 
 | ||
|  | <!-- EOF ---> |