Uczciwe ostrzeżenie, jestem nowy w programowaniu funkcjonalnym, więc mogę mieć wiele złych założeń.
Uczyłem się o typach algebraicznych. Wydaje się, że ma je wiele języków funkcjonalnych i są one dość przydatne w połączeniu z dopasowaniem wzorców. Jaki problem rozwiązują? Mogę zaimplementować pozornie (w pewnym sensie) typ algebraiczny w języku C # w następujący sposób:
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
{
}
Ale myślę, że większość zgodziłaby się, że jest to draństwo programowania obiektowego i nigdy nie powinieneś tego robić. Czy więc programowanie funkcjonalne po prostu dodaje czystszą składnię, która sprawia, że ten styl programowania wydaje się mniej obrzydliwy? Czego jeszcze mi brakuje?
class ThirdOption : Option{}
i podam ci miejsce, w new ThirdOption()
którym się spodziewałeś Some
lub None
?
data Maybe a = Just a | Nothing
(odpowiednik data Option a = Some a | None
w twoim przykładzie): nie można dodać trzeciego przypadku post-hoc. Chociaż możesz w pewien sposób emulować typy sum w języku C # w sposób pokazany przez Ciebie, nie jest to najładniejsze.