From 79402fa1f80e60420e12e6e48a74da165789af11 Mon Sep 17 00:00:00 2001 From: sanchime Date: Wed, 11 Jan 2023 21:07:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4Option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sanchime.Functional/Extensions/Option.cs | 23 +------------------ Sanchime.Functional/Products/Options/None.cs | 11 +++++---- .../Products/Options/OptionMonad.cs | 3 +++ 3 files changed, 10 insertions(+), 27 deletions(-) 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