Monads不是"flatMap"而是"flatUnit"?

-9 javascript monads haskell functional-programming category-theory

类别理论中的Monads由三元组T,单位,平坦 defined定义.

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
Run Code Online (Sandbox Code Playgroud)

KleisliTriple由运营商展示结构:( flatMapbind在Haskell中)由map和的组成flat.

但是,我总是认为在函数式编程中理解和实现Monad概念更加简单和容易,通过将结构与对象(例如flatUnit,unit和的组合)展平来构成函数flat.

在这种情况下,flatUnit(flatUnit(x)) = flatUnit(x).我实际上是用这种方式在JavaScript中实现的,并且使用flatUnitmap(只是一个传统的仿函数运算符),似乎可以获得Monad的所有好处.

所以,这是我的问题.

我一直在寻找有关flatUnit函数式编程中形式化的文档,但从未找到它.我理解有一个历史背景,Eugenio Moggi首先发现monad在函数式编程中的相关性,并且在他的论文中碰巧是KleisliTriple应用程序,但是因为Monads不仅限于Kleisli Category并且考虑flatUnit到它的简单性,对我来说它非常奇怪.

这是为什么?我错过了什么?

编辑:代码被删除.

dup*_*ode 10

在这个答案中,我不会再详述flatUnit.正如其他人所指出的那样,join . return = id对于任何monad(它是monad法律之一),所以没有太多可以谈论它本身.相反,我将在这里讨论讨论中提出的一些主题.

引用评论:

换句话说,具有扁平结构的仿函数,它是一个monad.

我相信,这是问题的核心.单子不需要与扁平结构的仿函数,而是一个仿函数,其值可以是平tened(与join在遵循一定规律的方式)("在endofunctors的类别幺半",俗话说).扁平化不是无损操作(即join成为同构).

join在类别理论的说法中,称为同构的Monads 被称为幂等monad 1.Monad但是,对于Haskell 是幂等的,monadic值必须没有额外的结构.这意味着程序员直接感兴趣的大多数monad将不是幂等的(事实上,我很难想到幂等的Haskell Monad不是Identity或类似身份).评论中已经提到的一个例子是列表:

join [[1,2],[3,4,5]] = [1,2,3,4,5] -- Grouping information discarded
Run Code Online (Sandbox Code Playgroud)

功能/阅读器monad给出了我所说的更具戏剧性的插图:

join (+) = \x -> x + x
Run Code Online (Sandbox Code Playgroud)

这个最近的问题提供了一个有趣的插图Maybe.OP有一个带签名的功能......

appFunc :: Integer -> Integer -> Bool -> Maybe (Integer,Integer)
Run Code Online (Sandbox Code Playgroud)

......并像这样使用它......

appFunc <$> u <*> v <*> w
Run Code Online (Sandbox Code Playgroud)

......从而获得Maybe (Maybe (Integer, Integer))结果.两层Maybe对应于两种不同的方式失败的:如果u,v或者wNothing,我们得到的Nothing; 如果它们中的三个是 - Just但是appFunc结果Nothing,我们得到Just Nothing; 最后,如果一切顺利,我们会得到一个JustJust.现在,情况可能就是我们,就像那个问题的作者一样,并不关心哪一层Maybe导致失败; 在这种情况下,我们会通过使用join结果或重写它来丢弃该信息u >>= \x -> v >>= \y -> w >>= \b -> appFunc x y b.在任何情况下,我们都可以使用或丢弃这些信息.


注1:在King和Wadler(Wadler关于monad的论文之一)中合并Monads时,作者为"幂等monad"引入了一个不同的,基本上不相关的含义.在他们的意义上,一个幂等的monad是一个(在应用符号中)- 一个例子.f <$> u <*> u = (\x -> f x x) <$> uMaybe