Haskell è la mia lingua preferita, è un linguaggio puramente funzionale. Non ha effetti collaterali, non ci sono incarichi. Se trovi difficile il passaggio a questa lingua, forse F # è un posto migliore per iniziare con la programmazione funzionale. F # non è puro.
Gli stati di incapsulamento degli oggetti, c'è un modo per ottenere questo in Haskell, ma questo è uno dei problemi che richiede più tempo per imparare perché è necessario imparare alcuni concetti di teoria delle categorie per capire profondamente le monadi.C'è zucchero sintattico che ti permette di vedere le monadi come compiti non distruttivi, ma a mio avviso è meglio dedicare più tempo a comprendere le basi della teoria delle categorie (la nozione di categoria) per ottenere una migliore comprensione.
Prima di provare a programmare in stile OO in Haskell, dovresti chiederti se usi veramente lo stile orientato agli oggetti in C#, molti programmatori usano le lingue OO, ma i loro programmi sono scritti nello stile strutturato.
La dichiarazione dei dati consente di definire strutture di dati che combinano prodotti (equivalenti a struttura in linguaggio C) e unioni (equivalenti a unione in C), la parte derivante della dichiarazione consente di ereditare metodi predefiniti.
Un tipo di dati (struttura dati) appartiene a una classe se ha un'implementazione dell'insieme di metodi nella classe. Ad esempio, se è possibile definire un metodo show :: a -> String per il proprio tipo di dati, quindi appartiene alla classe Show, è possibile definire il tipo di dati come un'istanza della classe Show.
Questo è diverso dall'uso della classe in alcune lingue OO in cui viene utilizzato come metodo per definire strutture + metodi.
Un tipo di dati è astratto se è indipendente dalla sua implementazione. Crea, muta e distruggi l'oggetto con un'interfaccia astratta, non hai bisogno di sapere come è implementato.
L'astrazione è supportata in Haskell, è molto semplice da dichiarare. Per esempio questo codice dal sito Haskell:
data Tree a = Nil
| Node { left :: Tree a,
value :: a,
right :: Tree a }
dichiara i selettori di sinistra, il valore, a destra. i costruttori possono essere definiti come segue, se si desidera aggiungerli alla lista di esportazione nella dichiarazione modulo:
node = Node
nil = Nil
I moduli sono costruiti in modo simile come in Modula. Ecco un altro esempio dello stesso sito:
module Stack (Stack, empty, isEmpty, push, top, pop) where
empty :: Stack a
isEmpty :: Stack a -> Bool
push :: a -> Stack a -> Stack a
top :: Stack a -> a
pop :: Stack a -> (a,Stack a)
newtype Stack a = StackImpl [a] -- opaque!
empty = StackImpl []
isEmpty (StackImpl s) = null s
push x (StackImpl s) = StackImpl (x:s)
top (StackImpl s) = head s
pop (StackImpl (s:ss)) = (s,StackImpl ss)
C'è ancora qualcosa da dire su questo argomento, spero che questo commento aiuti!
Dipende in gran parte dalle operazioni che si desidera eseguire su di esse. Puoi descrivere come vorresti usare gli oggetti di quelle classi nel tuo programma? – sepp2k
Ho scelto un esempio casuale. Sentiti libero di assumere qualsiasi operazione. Voglio solo avere l'idea generale di come tali situazioni siano gestite in Haskell. – Kibarim