Честное предупреждение, я новичок в функциональном программировании, поэтому я могу придерживаться многих неверных предположений.
Я изучал алгебраические типы. Кажется, что многие функциональные языки имеют их, и они довольно полезны в сочетании с сопоставлением с образцом. Однако какую проблему они на самом деле решают? Я могу реализовать на первый взгляд (вроде) алгебраический тип в C # следующим образом:
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
{
}
Но я думаю, что большинство согласится с тем, что это ублюдение объектно-ориентированного программирования, и вы никогда не должны этого делать. Так функциональное программирование просто добавляет более чистый синтаксис, который делает этот стиль программирования менее грубым? Что еще мне не хватает?
class ThirdOption : Option{}
и укажу, new ThirdOption()
где вы ожидали Some
или None
?
data Maybe a = Just a | Nothing
(эквивалентно data Option a = Some a | None
в вашем примере): вы не можете добавить третий случай post-hoc. В то время как вы можете эмулировать типы сумм в C #, как вы показали, это не самая красивая.