Un avvertimento equo, sono nuovo nella programmazione funzionale, quindi potrei avere molte ipotesi sbagliate.
Ho imparato a conoscere i tipi algebrici. Molti linguaggi funzionali sembrano averli e sono abbastanza utili in combinazione con la corrispondenza dei modelli. Tuttavia, quale problema risolvono effettivamente? Posso implementare un tipo algebrico apparentemente (in qualche modo) in C # come questo:
public abstract class Option { }
public class None : Option { }
public class Some<T> : Option
{
public T Value { get; set; }
}
var result = GetSomeValue();
if(result is None)
{
}
else
{
}
Ma penso che molti sarebbero d'accordo sul fatto che si tratta di una bastardizzazione della programmazione orientata agli oggetti, e non dovresti mai farlo. Quindi la programmazione funzionale aggiunge semplicemente una sintassi più pulita che rende questo stile di programmazione meno volgare? Cos'altro mi manca?
class ThirdOption : Option{}
e ti do un posto new ThirdOption()
dove ti aspettavi Some
o None
?
data Maybe a = Just a | Nothing
(equivalente a data Option a = Some a | None
nel tuo esempio): non è possibile aggiungere un terzo caso post-hoc. Mentre puoi emulare i tipi di somma in C # come hai mostrato, non è il più bello.