-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由运营商展示结构:( flatMap或bind在Haskell中)由map和的组成flat.
但是,我总是认为在函数式编程中理解和实现Monad概念更加简单和容易,通过将结构与对象(例如flatUnit,unit和的组合)展平来构成函数flat.
在这种情况下,flatUnit(flatUnit(x)) = flatUnit(x).我实际上是用这种方式在JavaScript中实现的,并且使用flatUnit和map(只是一个传统的仿函数运算符),似乎可以获得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或者w是Nothing,我们得到的Nothing; 如果它们中的三个是 - Just但是appFunc结果Nothing,我们得到Just Nothing; 最后,如果一切顺利,我们会得到一个Just值Just.现在,情况可能就是我们,就像那个问题的作者一样,并不关心哪一层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
| 归档时间: |
|
| 查看次数: |
412 次 |
| 最近记录: |