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 --->
 |