В последнее время я погружаюсь в увлекательный мир функционального программирования, в основном благодаря приобретению опыта работы с платформами FP, такими как React, и чтению блогов, подобных https://blog.ploeh.dk/. Как программист, в первую очередь императивный, это был интересный переход, но я все еще пытаюсь замочить себе ноги.
Я немного устал от использования string.IsNullOrEmpty
как такового. Большую часть времени я засыпаю свой код такими выражениями, как
_ = string.IsNullOrEmpty(str) ? "default text here" : str;
, что не так уж плохо, как кажется, но, скажем, я хотел связать кучу параметров за этим нулем, например
_ = string.IsNullOrEmpty(str) ? (
util.TryGrabbingMeAnother() ??
"default text here") : str;
Уф. Я бы предпочел что-то вроде этого -
_ = monad.NonEmptyOrNull(str) ??
util.TryGrabbingMeAnother() ??
"default text here";
Как видно из примера, я использую функцию, которую я называю монадой, чтобы помочь уменьшить string.IsNullOrEmpty
до операции с цепочкой нулей :
public string NonEmptyOrNull(string source) =>
string.IsNullOrEmpty(source) ? null : source;
У меня вопрос, это правильная терминология? Я знаю, что Nullable<T>
можно рассматривать как монаду (см. Может ли Nullable использоваться как функтор в C#? и Monad на простом английском sh? (Для программиста OOP с без фона FP) ). Эти материалы являются хорошими справочными материалами, но у меня все еще недостаточно интуитивного понимания предмета, чтобы понять, не просто ли я здесь запутываю или непоследователен. Например, я знаю, что монады должны включать объединение функций, как у меня выше, но они также являются «усилителями типов» - так что мой маленький пример, кажется, ведет себя как монада для включения цепочки, но кажется например, преобразование null / empty в просто null - это сокращение , а не усиление, поэтому я сомневаюсь, действительно ли это является монадой. Итак, для этого конкретного приложения, может ли кто-нибудь, имеющий немного больше опыта с FP, сказать мне, правильно ли называть NonEmptyOrNull
монадой, и почему или почему нет?