You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.6 KiB
141 lines
3.6 KiB
# Functional Go
|
|
...an easier introduction to functional programming
|
|
29 Jun 2020
|
|
Summary: Presentation of my bachelor thesis functional Go
|
|
|
|
|
|
|
|
Ramon Rüttimann
|
|
me@ramonr.ch
|
|
|
|
## (Learning) Functional Programming is hard
|
|
|
|
[What I Wish I Knew When Learning Haskell](http://dev.stephendiehl.com/hask/tutorial.pdf) - 475 pages
|
|
|
|
FUP@ZHAW teaches the very basics of functional programming with Haskell
|
|
- Changed the way I think about problems
|
|
- I understand the (very) basics
|
|
- Could not write production-ready code
|
|
- Learning syntax + paradigm
|
|
|
|
.code quicksort.hs
|
|
|
|
## Making it easier
|
|
|
|
Learn functional programming without learning a new syntax
|
|
|
|
Choose a language that:
|
|
|
|
- has a familiar syntax (with familiar keywords)
|
|
- is statically typed
|
|
- supports functions as first class citizens ("multi-paradigm")
|
|
- is as simple as possible
|
|
|
|
plus: add tooling to ensure a purely functional style
|
|
|
|
## The chosen one: Go
|
|
|
|
- C-like syntax
|
|
- statically typed
|
|
- multi-paradigm
|
|
- simple
|
|
|
|
> Clear is better than clever
|
|
|
|
Go Proverbs - Rob Pike
|
|
|
|
.image gopher.png _ 240
|
|
|
|
## Issues with Go
|
|
|
|
- No list type
|
|
- but slices
|
|
- no difference in usage, but in runtime
|
|
- No list processing functions (higher-order functions)
|
|
- No polymorphism
|
|
- apart from (compiler) built-in functions
|
|
- every call translated at compile time (AST rewriting)
|
|
- `append`, `make`, `len`, `new`, `copy`, ...
|
|
|
|
.code code/map.go
|
|
|
|
## Adding new built-in functions to the compiler
|
|
|
|
fmap, foldr, foldl, prepend, filter
|
|
|
|
- documentation (Godoc)
|
|
- type checking
|
|
- for external tools
|
|
- within the compiler
|
|
- AST walking / rewriting
|
|
- instead of directly writing code, write the code as AST nodes
|
|
|
|
## Example Builtin: fmap
|
|
|
|
.code code/walk/walk.go /START OMIT/,/END OMIT/
|
|
|
|
## Tooling: funcheck
|
|
|
|
Goal: add tooling to ensure a purely functional style
|
|
|
|
-> Write a code analysis tool that reports non-functional constructs
|
|
|
|
Definition of "purely functional":
|
|
> [...] Purely functional programming may also be defined by forbidding changing state and mutable data.
|
|
> Purely functional programming consists in ensuring that functions [...] will only depend on their arguments, regardless of any global or local state.
|
|
|
|
Purely functional programming - Wikipedia
|
|
|
|
## One rule to rule them all
|
|
|
|
Do not allow reassigments
|
|
|
|
- Disallow the `=` operator
|
|
- Only allow using `:=` (short variable declarations)
|
|
|
|
|
|
.play -numbers code/reassignments/main.go /START OMIT/,/END OMIT/
|
|
|
|
## ...with exceptions
|
|
|
|
> [...], a short variable declaration may redeclare variables [...]
|
|
> with the same type [...]. As a consequence, redeclaration can only appear in a multi-variable short
|
|
> declaration. Redeclaration does not introduce a new variable; it just assigns
|
|
> a new value to the original
|
|
|
|
Go Language Specification
|
|
|
|
.play -numbers code/reassignments/issues/main.go /START OMIT/,/END OMIT/
|
|
|
|
## Finding declarations
|
|
|
|
.play -numbers code/declprint/main.go /START OMIT/,/END OMIT/
|
|
|
|
## Putting it together
|
|
|
|
- Finds all (re)assignments through position, not the operator that is being used
|
|
- Recursive function literals need an exception
|
|
- For- and range-loops need to be reported explicitly
|
|
- Increment & Decrement operators need to be reported explicitly
|
|
|
|
.code code/funcliteral/main.go /START OMIT/,/END OMIT/
|
|
|
|
## Functional Go
|
|
|
|
.play -edit code/quicksort/main.go /START OMIT/,/END OMIT/ HLcustom
|
|
|
|
## Conclusion
|
|
|
|
- Clear is better than clever
|
|
- Verbosity is (in this case) a good thing
|
|
- Effort is lowered by the new built-in functions
|
|
- Does not / can not replace actual purely functional languages
|
|
- Limitations of the type system
|
|
- Performance considerations
|
|
- Open Source
|
|
|
|
.image me.png _ 215
|
|
|
|
: Type System: Polymorphism, sum types
|
|
: Performance: TCO (tail call optimisations)
|