66 lines
2.1 KiB
Org Mode
66 lines
2.1 KiB
Org Mode
#+title: Abstractions; Haskell vs Clojure
|
|
#+subtitle: How are both Haskell and Clojure good to capture some abstractions
|
|
#+date: [2020-01-18 Sat]
|
|
#+created: [2020-01-18 Sat]
|
|
#+author: Yann Esposito
|
|
#+EMAIL: yann@esposito.host
|
|
#+keywords: Haskell Clojure functional-programming
|
|
#+DESCRIPTION: Simulate some abstractions in Clojure vs Haskell
|
|
#+OPTIONS: auto-id:t toc:t
|
|
#+STARTUP: overview
|
|
|
|
#+begin_notes
|
|
This is a short essay to try to find if Haskell is as limited in its
|
|
abstractions power as I experienced many times when learning it.
|
|
Now I've got a lot more experience in Haskell and in Clojure.
|
|
I would like to see if I'll be able to manage to put some abstractions in
|
|
Haskell and in Clojure.
|
|
#+end_notes
|
|
|
|
* Abstractions
|
|
:PROPERTIES:
|
|
:CUSTOM_ID: abstractions
|
|
:END:
|
|
|
|
The notion of abstraction is generally not pretty well defined.
|
|
|
|
For example, not using pointer can be considered an abstraction.
|
|
Garbage collection is an abstraction.
|
|
Procedures are an abstraction.
|
|
ORM are an abstraction.
|
|
Monads are an abstraction.
|
|
Objects and Classes are an abstraction.
|
|
|
|
I would be surprised is not anyone has made a kind of hierarchy to organize
|
|
different abstractions as they seems to me of different nature.
|
|
|
|
In this post I will only focus on those few abstractions:
|
|
|
|
- Object Oriented Programming (Objects and Classes, inheritence, etc...)
|
|
- Frameworks for managing the lifecycle and dependencies of software
|
|
components with have runtime state (in Clojure: Component or Trapperkeeper)
|
|
- ORM/Store abstractions
|
|
|
|
* Object Oriented
|
|
:PROPERTIES:
|
|
:CUSTOM_ID: object-oriented
|
|
:END:
|
|
|
|
So in Clojure, this is quite straightforward if you consider you are
|
|
authorized to use the underlying language (java).
|
|
|
|
** Haskell
|
|
:PROPERTIES:
|
|
:CUSTOM_ID: haskell
|
|
:END:
|
|
|
|
Notion of Object, something that contain an inner state + some methods.
|
|
Notion of Class, a boilerplate for creating new Objects.
|
|
|
|
#+begin_src haskell
|
|
newtype MethodName = MethodName Text
|
|
data Object s m = Object { state :: s
|
|
, methods :: forall a. MethodName -> s -> a }
|
|
#+end_src
|
|
|
|
hmmm.... At the very begining of trying to write it down, it already suck...
|