C# 以下操作是否有通用函数编程名称

C# 以下操作是否有通用函数编程名称,c#,functional-programming,system.reactive,monads,naming,C#,Functional Programming,System.reactive,Monads,Naming,通过在我的C代码中的组合,我得到了一个类型 IObservable<Maybe<IObservable<T>>> events; 其中,Maybe是选项monad,IObservable是反应monad 现在我想把它转换成 IObservable<Maybe<T>> flatEvents; 我认为这表达了几乎相同的东西。注意,我想保留由maybe所体现的不可见事件。我不想把它完全展平,这样我只能在t的实例可用时看到事件 经过一点尝试

通过在我的C代码中的组合,我得到了一个类型

IObservable<Maybe<IObservable<T>>> events;
其中,Maybe是选项monad,IObservable是反应monad

现在我想把它转换成

IObservable<Maybe<T>> flatEvents;
我认为这表达了几乎相同的东西。注意,我想保留由maybe所体现的不可见事件。我不想把它完全展平,这样我只能在t的实例可用时看到事件

经过一点尝试和错误,我发现我可以通过

var flatEvents =  events
            .Select(p=>p.Select(q=>q.Select(v=>v.ToMaybe()))
                        .Else(Observable.Return(None<T>.Default)))
            .Switch();
其中None.Default返回一个为空的Maybe

T Maybe.ElseT v提取选项monad中包含的值,如果没有,则提供替代值


考虑到命名事物是最困难的事情是CS,我正在为这个扁平化操作符寻找一个名称。我不是haskell程序员,但我确信我还没有发明任何东西,这是一种常见的投影。这个有名字吗

我发现,只考虑类型,而不考虑任何特定的monad,更容易确定您的设计是什么

您需要类型为的函数:

:: Observable (Maybe (Observable a))
->
   Observable (Maybe a)
其中可能是一个单子,可观察的是一个单子

由于Monad是一个通用接口,因此我们确实有:

:: (Monad m, Monad t) => m (t (m a)) -> m (t a)
从这种类型我们可以看到它是一种分布在网络上的连接 内单子m

一些相关类型:

join :: Monad m => m (m a) -> m a

sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
事实上,它看起来非常像内部组件上的fmap序列,如下所示 通过一个连接-它几乎具有正确的类型,假设t是可遍历的 以及Monad:

> :t join . fmap T.sequence
    :: (Monad m, Functor m, Traversable t)
       => m (t (m a)) -> m (t a)
这就是我们的类型。文学硕士到文学硕士。太好了

所以,如果你真的需要命名它,它将是joinSequence或
某物但也许它不需要名字。

我发现,只考虑类型,而不考虑任何特定的单子,就可以更容易地确定您的设计是什么

您需要类型为的函数:

:: Observable (Maybe (Observable a))
->
   Observable (Maybe a)
其中可能是一个单子,可观察的是一个单子

由于Monad是一个通用接口,因此我们确实有:

:: (Monad m, Monad t) => m (t (m a)) -> m (t a)
从这种类型我们可以看到它是一种分布在网络上的连接 内单子m

一些相关类型:

join :: Monad m => m (m a) -> m a

sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
事实上,它看起来非常像内部组件上的fmap序列,如下所示 通过一个连接-它几乎具有正确的类型,假设t是可遍历的 以及Monad:

> :t join . fmap T.sequence
    :: (Monad m, Functor m, Traversable t)
       => m (t (m a)) -> m (t a)
这就是我们的类型。文学硕士到文学硕士。太好了

所以,如果你真的需要命名它,它将是joinSequence或
某物但也许它不需要名字。

只是好奇什么是可观测的可能?这可能会被可观察的。空的,或者在你的领域中会是松散的意义吗?只是好奇什么是可观察的?可以用observeable.Empty来代替它,或者在你的领域中会有松散的含义吗?