diff --git a/Sanchime.Functional/Extensions/Option.cs b/Sanchime.Functional/Extensions/Option.cs index 63bcaf9..d93fd13 100644 --- a/Sanchime.Functional/Extensions/Option.cs +++ b/Sanchime.Functional/Extensions/Option.cs @@ -2,31 +2,10 @@ namespace Sanchime.Functional.Extensions; public static class OptionExtension { - - - #region 函子: 同一范畴内不同对象之间的态射 - - // public static Option Map(this None _, Func mapping) - // => Option.None; - - // public static Option Map(this Some some, Func mapping) - // => Option.Some(mapping(some.Value)); - - // public static Option Map(this Option option, Func mapping) - // => option.Match(() => Option.None, (val) => Option.Some(mapping(val))); - - // public static IOption Map(this Option option, Func mapping) - // => option.Map(mapping.Curry()); - - // public static IOption Map(this Option option, Func mapping) - // => option.Map(mapping.CurryFirst()); - #endregion - #region 单子: 自函子范畴上的幺半群 - public static Option Bind(this Option option, Func> binding) - => option.Match(() => new Option(), binding); + public static IEnumerable Bind(this Option option, Func> binding) => option.AsEnumerable().Bind(binding); diff --git a/Sanchime.Functional/Products/Options/None.cs b/Sanchime.Functional/Products/Options/None.cs index 556ca45..a2e4887 100644 --- a/Sanchime.Functional/Products/Options/None.cs +++ b/Sanchime.Functional/Products/Options/None.cs @@ -3,12 +3,13 @@ namespace Sanchime.Functional.Products; /// /// 状态 /// -public readonly partial struct None : IOption +public readonly partial struct None : IOption { - /// - /// 静态构造形成单例 - /// - static None() { } + public None() + { + + } public bool IsSome => false; internal static readonly None Default = new(); + public Unit Value { get; } = Unit.Value; } diff --git a/Sanchime.Functional/Products/Options/OptionMonad.cs b/Sanchime.Functional/Products/Options/OptionMonad.cs index 3e3492d..3eda082 100644 --- a/Sanchime.Functional/Products/Options/OptionMonad.cs +++ b/Sanchime.Functional/Products/Options/OptionMonad.cs @@ -13,4 +13,7 @@ public readonly partial struct Option public static IOption Return(TValue value) => Return(value); + + public Option Bind(Func> binder) + => this.Match(() => new Option(), binder); } \ No newline at end of file