Faire Warnung, ich bin neu in der funktionalen Programmierung, daher kann ich viele schlechte Annahmen vertreten.
Ich habe etwas über algebraische Typen gelernt. Viele funktionale Sprachen scheinen sie zu haben, und sie sind in Verbindung mit dem Mustervergleich ziemlich nützlich. Welches Problem lösen sie jedoch tatsächlich? Ich kann einen scheinbar (irgendwie) algebraischen Typ in C # wie folgt implementieren:
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
{
}
Aber ich denke, die meisten würden zustimmen, dass dies eine Bastardisierung der objektorientierten Programmierung ist, und Sie sollten dies niemals tun. Fügt die funktionale Programmierung nur eine klarere Syntax hinzu, die diesen Programmierstil weniger grob erscheinen lässt? Was fehlt mir noch?
class ThirdOption : Option{}
und dir ein gebe, new ThirdOption()
wo du es erwartet hast Some
oder None
?
data Maybe a = Just a | Nothing
(äquivalent zu data Option a = Some a | None
in Ihrem Beispiel): Sie können keinen dritten Fall post-hoc hinzufügen. Zwar können Sie Summentypen in C # so emulieren, wie Sie es gezeigt haben, aber es ist nicht das Schönste.