|
c******o 发帖数: 1277 | 2 这是很典型的实际应用coding,如果把list换成无始无终的stream就更加清楚了。
这是很典型的applicative functor, 基本上是用zip combinator.
那为啥要问monad呢? 每一个monad都是applicative functor,但是不是每个
applicative functor都是monad
的。
list 可以用monad的map, flatMap来实现,但是很不清楚。 用zip就很好。
unlimited stream根本就没法用monad的map, flatMap,不会返回的。只能用 zip
因为unlimited stream不是monad.
如果你熟悉functor, applicative functor, monad 对一个问题,你很快就能想到怎么
处理。
对于处理某个问题的lib你也很快就能上手。 |
|
c******o 发帖数: 1277 | 3 Monad 是代数结构
定义就是在一定类型上的一系列操作,加一起是一个monad
你说的其实不是monad
看看
http://www.intensivesystems.net/tutorials/monads_101.html
monad是关于type的,
monad function要对对应的type来写.
dynamic type也一样。
例子:
比如说我要做library validate manipulate Json, 我的library 能创建function来
做这事。
但是我有好几个这样的function想要各种组合。
怎么办?直接组合的话,万一input invalid怎么传下来。我是事先不知道输入的。
这个要是用exception之类的就有side effect了 |
|
p*****2 发帖数: 21240 | 4
我是说一个monad可以应用到不同的类型,比如list, vector, set。不是混着用。
话说我confused地地方是,Scala说list, vector, set都是monad,可是monad的定义不
就是return, bind两个函数吗?这个怎么联系起来?我看clojure中monad和数据类型是
分开的。数据类型就是list, vector, set这些,而monad就是定义两个函数。 |
|
p*****2 发帖数: 21240 | 5
感觉这个更靠谱一点。我觉得说List是monadic type更恰当一点。monad应该是另外一
个东西。
现在对scala有个疑问。
clojure的话,同一个type,比如list,我可以写很多个monad应用在list上,行为可以
千奇百怪。可是scala说list就是monad,我怎么搞很多个monad应用在list上呢? |
|
p*****2 发帖数: 21240 | 6
some
这个我知道。你的意思除了这些就不用其他monad了?那不需要理解monad完全可以工作
。因为这是隐式在使用。也体会不到monad pattern的含义。
我的意思有没有必须要理解monad才能工作的地方。像scalaz应该有不少monad吧? |
|
a*****e 发帖数: 1700 | 7 我举个例子吧。文中那个关于 list functor 的图,粗暴地把 fmap (+2) 解释为把列
表里面每个元素加二,是不对的。满足 functor 的条件仅仅是:
fmap id = id
fmap (f . g) = fmap f . fmap g
所以针对列表,我完全可以定义如下的 fmap 实现:
fmap f l = l
满足 functor 的定律吧?不能够被那个图解释吧?你可以说我这个例子太极端,not
interesting,但我要说的是,用具象的例子来理解抽象的概念,会限制你的思考。
文中这些图示最大的的错误在于,会让人以为可以往一个盒子(比如一个属于类型 M a
的值)里放进去一个属于类型 a 的值。这是大错特错。
比如 Cont r a = (a -> r) -> a 这个定义,对于任意一个类型 r,类型 Cont r 都可
以是一个 monad (因为可以定义与之相关的 return 和 bind 操作满足 monad laws)
。那么你看看在这个具体的数据类型的盒子(Cont r)里面,又在哪里装着一个 a 类型
的值?完全没有!
而且对新手学习 mon... 阅读全帖 |
|
c******o 发帖数: 1277 | 8 On the other hand, Monad is HARD to explain:
As a formal definition of a structure, Monad is
basically a group of types that can implement
unit/flatMap function that match the signature in
def unit[A](a: => A): F[A]
def flatMap[A,B](ma: F[A])(f: A => F[B]): F[B]
But that is not enough, we also have law that
Monad type need to fulfill so that we know our
implementation of unit/flatMap is correct.
// Monad Law
// left identity: f(a) == flatmap(unit(a), f)
// right identity: a == flatMap(a, x => un... 阅读全帖 |
|
c******o 发帖数: 1277 | 9 List,vector,set 是不同的monad,你没法随意顺序的把他们组合在一起。
比如
list -> vector -> list -> vector 可以么?
自己做两个是可以,但那就不是monad了,没法利用monad的已有的性质
for (
x <- fx
y<- fy
) yield ( x .... y)
外面的类型一定是f,里面的类型是( x....y)
fx,fy 都是一种类型
monad |
|
H****S 发帖数: 1359 | 10 其实只要有对type constructor有概念上的感知,基本花个5分钟浏览一遍就可以了。
这个真的只是皮毛,深入下去还是要学习各种具体的monad实现。List,Option这些有
一个“容器”的直观感受,所以理解起来容易。看看这个用State monad实现的stack操
作(copied from http://eed3si9n.com/learning-scalaz)
def stackManip: State[Stack, Int] = for {
_ <- push(3)
a <- pop
b <- pop
} yield(b)
这个chained monad本身也是一个function,代表对于给定__任意__一个stack,做一次
进栈(3),和两次出栈操作。换句话说这代表的是对一个过程的描述,不需要任何具
体的输入。最后返回的State monad包含stack本身(操作后)以及最后一次出栈的数。 |
|
p*****2 发帖数: 21240 | 11 把几天前的design 用monad做了一遍 发觉确实比以前对问题的抽象和理解更清晰了
当时就觉得那个设计应该是有pattern的 原来就是monad。
其实即使不会monad 你可能已经在制造monad了。 毕竟归根结底就是问题的抽象。 |
|
|
p*****2 发帖数: 21240 | 13 除了Haskell,在其他语言,比如Scala,Clojure里用处大吗?
我知道for comprehension是monad, 但是,不知道它是monad也一点也不影响使用呀。
到底monad在Scala,Clojure里有多大的作用呀? |
|
c******o 发帖数: 1277 | 14 For 就是一个 syntax sugar
Monad的本质是就是一个抽象代数结构。带flatMap/unit的
编程用它是为了control effect,让各种带effect的都可以compose
很多monad你用了可能都没注意到。
Monad 不是唯一的重要东西。
最近几年, applicative functor 就很火。
这些其实和app developer 关系不大,但是自己写reusable code(library/routine)
离不开 |
|
p*****2 发帖数: 21240 | 15
)
我看clojure上,同样的数据类型我可以应用不同的monad上去。这个Scala怎么搞?怎
么感觉每个type自己实现了flatmap和unit,也就是说只有一个monad呢?要想应用另外
的monad要新建一个type吗? |
|
p*****2 发帖数: 21240 | 16
我的意思是同一种type要应用不同的monad是怎么搞的?我感觉Scala是把type和monad
混一起了?
动态语言的话,一个monad应该是可以对应不同type的。比如list, vector, set这些。
行为都很类似。 |
|
c******o 发帖数: 1277 | 17 实际上不同的 function吧?
这几个data structure 的可能可以共通, general的不可能共通。
Maybe monad, future monad, list monad 的 bind/return不可能是一样 implement
的,不然你查查
source. |
|
p*****2 发帖数: 21240 | 18
general的不共通是一定的。
但是monad和type是分开定义的,没有混在一起。好像也没有说法list就是monad。这个
跟scala不一样。这个我还得研究一下到底怎么回事。不过clojure的monad理解起来感
觉更简单。 |
|
p*****2 发帖数: 21240 | 19 functional scala 一定要用monad吗?
我指的是显式的用。不是隐式的用list,future就算用了。
或者说不理解monad可以算functional scala吗?
monad在实践中在scala项目中的比重有多大?比如kafka,spark这些项目。 |
|
a*****e 发帖数: 1700 | 20 能够很好地理解 continuation monad 和 free monad 你就入门了。用 scala 不需要
学习 monad transformer.
常见的还有 applicative 和 monoid,这两个都还比较简单。 |
|
c******o 发帖数: 1277 | 21 学习monad的严谨数学定义是最好的,但是monad的意义真不是这个,对developer没啥
用处。每个人对monad 的理解其实都不是一模一样。
我以前都学过,最后brown bag 还是选的通俗易懂,有意思的讲。 |
|
c******o 发帖数: 1277 | 22 The 通俗易懂地 explanation is:
Now see all these formal definition, still what is a Monad for us programmer
? and Why we need them?
def unit[A](a: => A): M[A]
def flatMap[A,B](ma: M[A])(f: A => M[B]): M[B]
A bit long explanation here:
Monad seems just like a wrapper, it wraps in a basic type (A here), and put
into a context M, generate
a richer type (M[A] here). unit function does this.
We care about the value of type A in context M, but we hate part of the
context that is troublesome.
The troublesom... 阅读全帖 |
|
z****e 发帖数: 54598 | 23 我觉得这样理解不好
还是分开来,aop理解aop
monad理解monad
monad通过flatmap那些理解比较容易
coltzhao解释得很清楚,aop过来理解反而乱
aop难点是aspect,其他都简单 |
|
z****e 发帖数: 54598 | 24 monad是一种特殊的apect
aspect不管你怎么处理
但是monad定义了bind&return
你如果不满足这两个条件,就不是monad
但是完全可以是aspect
aspect的scope甚至超过了functor
比functor更加的general,functor毕竟定义了bind
而aspect只要你能找到pointcut,能作出相应的操作
就是aspect,未必是bind
从自由度来说,aop更加容易,因为限制少
比functor还自由,tradeoff就是你需要用它的编译器
所以scala等jvm上非java语言就不能用了 |
|
b***e 发帖数: 1419 | 25 Sounds like a built-in list monad. Yes, list monad is a singlarity in the
context of node.js. Node.js can only support it if a generator object can
be cloned. I didn't figure out how to do that. But I think list monad (aka
monoids) is more confusing than useful to most people most of the time.
yieldfrom |
|
c******o 发帖数: 1277 | 26 我觉得作用就是你可以在一定的时候自己写。并且能确定你写的可以compose (monad有
固定的property可以check).
你知道它是monad以后,可以马上就用join/map/unit写出一堆各种各样的function
(都可以用 join/map/unit写出来, 或者 flatMap/unit, 两个都是minimum set)。
就是一个抽象结构。有兴趣研究一下scalaz就知道了。 |
|
p*****2 发帖数: 21240 | 27
for 在scala里是monad的唯一表现形式吗?我怎么感觉Scala把monad在概念上给搞复杂
化了? |
|
|
p*****2 发帖数: 21240 | 29
我觉得scala FP和OO搞在一起使得理解起来很费劲。
你说clojure also define 2 functions for each type是啥意思?
clojure定义monad跟data type是分开的。而且clojure是dynamic的,定义monad根本不
需要指定type。 |
|
c******o 发帖数: 1277 | 30 我想了一下,有好几个办法,比如说
1. inherit from List, override flatMap
2. create a type wrap List, and implicit conversion it <-> List, implement
flatMap and/or other methods, in the new type.
不过都好像是为了OO/java妥协,不是那么自然。
当然还有一个选项:
use scalaz, https://github.com/scalaz/scalaz
scalaz里面基本上实现了几乎全部抽象的haskell代数结构 (monoid, applicative,
functor, monad, arrow, comonad etc....)
那里有抽象的monad,可以比较自然好看的实现你要做的事 |
|
c******o 发帖数: 1277 | 31 太复杂了,一般的monad( future/list/stream(其实不是monad)/Option/Try/Either)
能理解, app development足够了。
continuation/free 都是advanced topic |
|
c******o 发帖数: 1277 | 32 不理解怎么用?
monad的局限是什么? 我为啥要用它?有啥好处. 和其他的ADT 一起用怎么办?
你不用把你的logic/flow设计成monad, 但是不理解也用不好。 |
|
p*****2 发帖数: 21240 | 33 几个monad都搞完了,感觉coffee还真的很elegant呀。每个monad不超过10行代码。 |
|
c******o 发帖数: 1277 | 34 monad的目的就是回复不具备组合性的数据的组合性。
什么是组合性的呢?
就是说两个函数,都输入产出同一类数据,但是你没法简单的连接他们。
因为:
1. 可能的error/exception/null
2.这个数据是 整整一个stream/list的数据,
3.这个数据本身的产生是有延迟的,而且可能失败。
4.这个数据本身要求(就是)实时的输入或输出。
5.这个数据是由内部状态的,第一次用/第二次用是不一样的。
你要是还想要写个函数就能保证它在那儿用都是你认为的逻辑,而不是在各种复杂情况
面前一再修改,多个版本,添加大量的if/else/for/while/switch, 那怎么办?
自己做一个monad就解决了。 |
|
a*****e 发帖数: 1700 | 35 这种理解方式可以上路,但走不远。建议从 fmap/return/join 来理解 monad,或者学
习以下怎么用 monad 来表达 non-determinism 和 continuation. |
|
z****e 发帖数: 54598 | 36 反了
monad是aop的一种
aspect是一个抽象的概念
monad是design pattern,不仅包括了aspect
还定义了怎么操作 |
|
b***e 发帖数: 1419 | 37 来自主题: _FunctionalProgramming版 - Monad(0) I always wanted to write something about monad, but when I get time, I
don't have the interest; and when I have the interest, I don't have time.
Then end of the day, I figured if I don't start, I'll never start. So let
me start something at least and see where we could go.
In fact, I am trying to discuss monad in a philosophical manner, rather
than a mathematical manner. That is, let's forget about the bullshit of
category theory and Professor Philip Wadler, at least for a moment.
First in th |
|
E*****m 发帖数: 25615 | 38 A monad is just a monoid in the category of endofunctors, what's the problem
? |
|
c******o 发帖数: 1277 | 39 我的理解是
monad -> 人
List -> 黑人
future -> 白人
.....
scala 没有费心思定义这个“人” |
|
b***e 发帖数: 1419 | 40 这个思路好,然而理解是错误的。
monad是一个形容词,不是一个名词。list是一个名词。比如我们说peking2是个大牛,
这个“大牛”应该理解成一个形容词,而不是一个名词。那么peking2为什么是个大牛
呢?因为他作为一个type constructor可以定义出相应的bind和unit。这下大家都满意
了吧。 |
|
p*****2 发帖数: 21240 | 41
嗯。我觉得还是scalaz靠谱,虽然我还没看。但是能感觉到。所以,scala这个课程上
讲monad,很多人都看不懂。我也看不懂,看了Clojure的解释才清晰起来。这个也是我
以前抱怨的,scala把OO和FP搅在一起很混乱。 |
|
p*****2 发帖数: 21240 | 42
google Monads as a theoretical foundation for AOP |
|
z****e 发帖数: 54598 | 43 不过点醒了我
aop我有信心可以用很直白的语言解释清楚
那如果类似的话,我可以考虑用很精炼的语言去解释monad这个东西
不过>>=这种符号太反人类了 |
|
c*******9 发帖数: 9032 | 44 纯functional 大多要用到monad吧。 |
|
c******o 发帖数: 1277 | 45 monad是一种data control structure, 是一种pattern
你当然可以不用。像java不用di,ioc一样,自己取舍。
但大家都用,自然有他的道理和好处 |
|
c******o 发帖数: 1277 | 46 app developer 一般不用自己design monad
理解还是需要的。 |
|
p*****2 发帖数: 21240 | 47
用肯定用到。我想知道的是,monad anywhere吗?到底多大程度上用。 |
|
p*****2 发帖数: 21240 | 48
大牛的项目用到多少monad?常用的是哪些? |
|
p*****2 发帖数: 21240 | 49
嗯。我想问的就是使用的问题。到底多大程度上用到了monad。常用的有哪些。库就是
scalaz吧? |
|
c******o 发帖数: 1277 | 50 in real work, everything is a monad/applicative functor/functor...
like future, list, json validator, error handling, db object etc.
but I did not design or implement most of them, only used them.
even common MVC components have functional combinators (means them are some
sort of ADTs). |
|