范畴理论中的单子是由三元组T、单位、平层等定义的。
class Monad t where
map :: (a -> b) -> (t a -> t b) -- functorial action
unit :: a -> t a
flat :: t (t a) -> t a
class KleisliTriple t where
unit :: a -> t a
flatMap :: t a -> (a -> t b) -> t b
KleisliTriple通过以下操作符对结构进行扁平化处理:flatmap
(或Haskell中的bind
),即由map
和flat
组成。
但是,我一直认为,通过用flatUnit
这样的对象扁平化结构来组合函数,会更容易理解和实现函数编程中的单元体conept,即Unit
和flat
的组合。
在本例中,flatUnit(flatUnit(x))=flatUnit(x)
。实际上,我在JavaScript中是以这种方式实现的,并且使用FlatUnit
和Map
(只是一个遗留的函数运算符),似乎可以获得Monad的所有优点。
所以,这是我的问题。
我一直在寻找函数式编程中关于FlatUnit
形式化的文档,但从未找到。我知道Eugenio Moggi有一个历史背景,他首先发现了单子在函数式编程中的相关性,在他的论文中,碰巧是KleisliTriple应用程序,但由于单子并不局限于Kleisli类别,并且考虑到FlatUnit
的简单性,对我来说,这是非常奇怪的。
编辑:代码被删除。
在这个答案中,我不会详细讨论FlatUnit
。正如其他人所指出的,join。对于任何单子(这是单子定律之一),return=id
,因此没有太多关于它本身的内容。相反,我将在这里讨论讨论中提出的一些周边主题。
引用一条评论:
换句话说,具有扁平结构的函子,是单子。
join [[1,2],[3,4,5]] = [1,2,3,4,5] -- Grouping information discarded
join (+) = \x -> x + x
appFunc :: Integer -> Integer -> Bool -> Maybe (Integer,Integer)
appFunc <$> u <*> v <*> w
...从而获得Maybe(Maybe(Integer,Integer))
结果。maybe
的两个层对应于两种不同的失败方式:如果U
、V
或W
是nothing
,则我们得到nothing
;如果其中三个是just
-values,但appfunc
导致nothing
,则我们得到just nothing
;最后,如果所有操作都成功,我们将得到一个just
-just
中的值。现在,我们可能像那个问题的作者一样,并不关心的哪一层可能导致了失败
;在这种情况下,我们将丢弃该信息,要么对结果使用join
,要么将其重写为u>>=\x->v>>=\y->w>>=\b->appFunc x y b
。在任何情况下,这些信息都是供我们使用或丢弃的。
注1:在King和Wadler的《组合单子》(Wadler关于单子的论文之一)中,作者为“幂等单子”引入了一个不同的、基本上不相关的含义。在它们的意义上,幂等单子是这样的单子:(在应用符号中)f<$>u<*>u=(\x->fxx)<$>u
--一个例子是maybe
。
我非常熟悉< code>for comprehension和< code>flatMap on Options。 所以我知道你可以这样做 如果理解中没有任何内容是 ,则给了我 因为它正在对每个语句执行 。 但实际上我在寻找相反的东西。我想遍历到< code>for理解,只要一切都是< code>None,就像< code>for理解中的< code>orElse一样。 例如: 有没有类似的东西,或
根据Mozilla开发者网站:
我是RxJava的新手,经常被平面图函数弄糊涂。根据文档,平面图 有人能给出一个很好的用例吗?为什么要将原来的可观察对象转换为可观察对象(复数),然后将它们转换为单个可观察对象。 你为什么不直接用“地图”呢? 如果你举一个Android的例子,那就太棒了,否则纯Java就足够了。谢谢
我已经找到了很多关于RxJava的答案,但我想了解它在Reactor中是如何工作的。 我目前的理解是非常模糊的,我倾向于认为map是同步的,flatMap是异步的,但我不能真正理解它。 以下是一个例子: 我有文件(a
我使用的是Flink 0.10.0数据流。这是我的要求。 我的源系统是广播消息的自定义系统。在我的自定义SourceFunction实现中,我实现了回调来侦听消息。 每个回调都会得到不同类型的消息。 我想解码/转换在回调中收到的对象发送到我的SinkFunction。我相信我可以用FlatMapFunction或类似的软件来完成。 因为我有各种回调,所以我听每个回调的解码逻辑是不同的。我想不能有一
作为开发团队的一部分,我们希望构建一个非阻塞应用程序,因为我们正在使用SpringReactor 3构建我们的应用程序。因此,在使用project reactor时,我有一系列问题: > 在单个管道和