p*****2 发帖数: 21240 | 1 除了Haskell,在其他语言,比如Scala,Clojure里用处大吗?
我知道for comprehension是monad, 但是,不知道它是monad也一点也不影响使用呀。
到底monad在Scala,Clojure里有多大的作用呀? |
c******o 发帖数: 1277 | 2 我觉得作用就是你可以在一定的时候自己写。并且能确定你写的可以compose (monad有
固定的property可以check).
你知道它是monad以后,可以马上就用join/map/unit写出一堆各种各样的function
(都可以用 join/map/unit写出来, 或者 flatMap/unit, 两个都是minimum set)。
就是一个抽象结构。有兴趣研究一下scalaz就知道了。
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 除了Haskell,在其他语言,比如Scala,Clojure里用处大吗? : 我知道for comprehension是monad, 但是,不知道它是monad也一点也不影响使用呀。 : 到底monad在Scala,Clojure里有多大的作用呀?
|
p*****2 发帖数: 21240 | 3
for 在scala里是monad的唯一表现形式吗?我怎么感觉Scala把monad在概念上给搞复杂
化了?
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我觉得作用就是你可以在一定的时候自己写。并且能确定你写的可以compose (monad有 : 固定的property可以check). : 你知道它是monad以后,可以马上就用join/map/unit写出一堆各种各样的function : (都可以用 join/map/unit写出来, 或者 flatMap/unit, 两个都是minimum set)。 : 就是一个抽象结构。有兴趣研究一下scalaz就知道了。
|
c******o 发帖数: 1277 | 4 For 就是一个 syntax sugar
Monad的本质是就是一个抽象代数结构。带flatMap/unit的
编程用它是为了control effect,让各种带effect的都可以compose
很多monad你用了可能都没注意到。
Monad 不是唯一的重要东西。
最近几年, applicative functor 就很火。
这些其实和app developer 关系不大,但是自己写reusable code(library/routine)
离不开 |
p*****2 发帖数: 21240 | 5
)
我看clojure上,同样的数据类型我可以应用不同的monad上去。这个Scala怎么搞?怎
么感觉每个type自己实现了flatmap和unit,也就是说只有一个monad呢?要想应用另外
的monad要新建一个type吗?
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : For 就是一个 syntax sugar : Monad的本质是就是一个抽象代数结构。带flatMap/unit的 : 编程用它是为了control effect,让各种带effect的都可以compose : 很多monad你用了可能都没注意到。 : Monad 不是唯一的重要东西。 : 最近几年, applicative functor 就很火。 : 这些其实和app developer 关系不大,但是自己写reusable code(library/routine) : 离不开
|
c******o 发帖数: 1277 | 6 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 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : ) : 我看clojure上,同样的数据类型我可以应用不同的monad上去。这个Scala怎么搞?怎 : 么感觉每个type自己实现了flatmap和unit,也就是说只有一个monad呢?要想应用另外 : 的monad要新建一个type吗?
|
p*****2 发帖数: 21240 | 7
我的意思是同一种type要应用不同的monad是怎么搞的?我感觉Scala是把type和monad
混一起了?
动态语言的话,一个monad应该是可以对应不同type的。比如list, vector, set这些。
行为都很类似。
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Monad 是代数结构 : 定义就是在一定类型上的一系列操作,加一起是一个monad : 你说的其实不是monad : 看看 : http://www.intensivesystems.net/tutorials/monads_101.html : monad是关于type的, : monad function要对对应的type来写. : dynamic type也一样。 : 例子: : 比如说我要做library validate manipulate Json, 我的library 能创建function来
|
c******o 发帖数: 1277 | 8 List,vector,set 是不同的monad,你没法随意顺序的把他们组合在一起。
比如
list -> vector -> list -> vector 可以么?
自己做两个是可以,但那就不是monad了,没法利用monad的已有的性质
for (
x <- fx
y<- fy
) yield ( x .... y)
外面的类型一定是f,里面的类型是( x....y)
fx,fy 都是一种类型
monad
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 我的意思是同一种type要应用不同的monad是怎么搞的?我感觉Scala是把type和monad : 混一起了? : 动态语言的话,一个monad应该是可以对应不同type的。比如list, vector, set这些。 : 行为都很类似。
|
p*****2 发帖数: 21240 | 9
我是说一个monad可以应用到不同的类型,比如list, vector, set。不是混着用。
话说我confused地地方是,Scala说list, vector, set都是monad,可是monad的定义不
就是return, bind两个函数吗?这个怎么联系起来?我看clojure中monad和数据类型是
分开的。数据类型就是list, vector, set这些,而monad就是定义两个函数。
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : List,vector,set 是不同的monad,你没法随意顺序的把他们组合在一起。 : 比如 : list -> vector -> list -> vector 可以么? : 自己做两个是可以,但那就不是monad了,没法利用monad的已有的性质 : for ( : x <- fx : y<- fy : ) yield ( x .... y) : 外面的类型一定是f,里面的类型是( x....y) : fx,fy 都是一种类型
|
c******o 发帖数: 1277 | 10 Scala just does not have monad trait...
You can see flatMap in all these data type , which is same as clojure, you
also define 2 functions for each type
If you want to see a formal implementation of monad, check scalaz
http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/s
http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/s
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 我是说一个monad可以应用到不同的类型,比如list, vector, set。不是混着用。 : 话说我confused地地方是,Scala说list, vector, set都是monad,可是monad的定义不 : 就是return, bind两个函数吗?这个怎么联系起来?我看clojure中monad和数据类型是 : 分开的。数据类型就是list, vector, set这些,而monad就是定义两个函数。
|
|
|
p*****2 发帖数: 21240 | 11
我觉得scala FP和OO搞在一起使得理解起来很费劲。
你说clojure also define 2 functions for each type是啥意思?
clojure定义monad跟data type是分开的。而且clojure是dynamic的,定义monad根本不
需要指定type。
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : Scala just does not have monad trait... : You can see flatMap in all these data type , which is same as clojure, you : also define 2 functions for each type : If you want to see a formal implementation of monad, check scalaz : http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/s : http://scalaz.googlecode.com/svn/continuous/latest/browse.sxr/s
|
c******o 发帖数: 1277 | 12 实际上不同的 function吧?
这几个data structure 的可能可以共通, general的不可能共通。
Maybe monad, future monad, list monad 的 bind/return不可能是一样 implement
的,不然你查查
source.
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 我觉得scala FP和OO搞在一起使得理解起来很费劲。 : 你说clojure also define 2 functions for each type是啥意思? : clojure定义monad跟data type是分开的。而且clojure是dynamic的,定义monad根本不 : 需要指定type。
|
p*****2 发帖数: 21240 | 13
general的不共通是一定的。
但是monad和type是分开定义的,没有混在一起。好像也没有说法list就是monad。这个
跟scala不一样。这个我还得研究一下到底怎么回事。不过clojure的monad理解起来感
觉更简单。
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 实际上不同的 function吧? : 这几个data structure 的可能可以共通, general的不可能共通。 : Maybe monad, future monad, list monad 的 bind/return不可能是一样 implement : 的,不然你查查 : source.
|
c******o 发帖数: 1277 | 14 我的理解是
monad -> 人
List -> 黑人
future -> 白人
.....
scala 没有费心思定义这个“人”
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : : general的不共通是一定的。 : 但是monad和type是分开定义的,没有混在一起。好像也没有说法list就是monad。这个 : 跟scala不一样。这个我还得研究一下到底怎么回事。不过clojure的monad理解起来感 : 觉更简单。
|
b***e 发帖数: 1419 | |
b***e 发帖数: 1419 | 16 这个思路好,然而理解是错误的。
monad是一个形容词,不是一个名词。list是一个名词。比如我们说peking2是个大牛,
这个“大牛”应该理解成一个形容词,而不是一个名词。那么peking2为什么是个大牛
呢?因为他作为一个type constructor可以定义出相应的bind和unit。这下大家都满意
了吧。
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我的理解是 : monad -> 人 : List -> 黑人 : future -> 白人 : ..... : scala 没有费心思定义这个“人”
|
s******y 发帖数: 416 | 17 “是个大牛”中的“大牛”理解为形容词?有点汗
【在 b***e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个思路好,然而理解是错误的。 : monad是一个形容词,不是一个名词。list是一个名词。比如我们说peking2是个大牛, : 这个“大牛”应该理解成一个形容词,而不是一个名词。那么peking2为什么是个大牛 : 呢?因为他作为一个type constructor可以定义出相应的bind和unit。这下大家都满意 : 了吧。
|
p*****2 发帖数: 21240 | 18
你这个不是OO的inheritance吗?
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我的理解是 : monad -> 人 : List -> 黑人 : future -> 白人 : ..... : scala 没有费心思定义这个“人”
|
p*****2 发帖数: 21240 | 19
感觉这个更靠谱一点。我觉得说List是monadic type更恰当一点。monad应该是另外一
个东西。
现在对scala有个疑问。
clojure的话,同一个type,比如list,我可以写很多个monad应用在list上,行为可以
千奇百怪。可是scala说list就是monad,我怎么搞很多个monad应用在list上呢?
【在 b***e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个思路好,然而理解是错误的。 : monad是一个形容词,不是一个名词。list是一个名词。比如我们说peking2是个大牛, : 这个“大牛”应该理解成一个形容词,而不是一个名词。那么peking2为什么是个大牛 : 呢?因为他作为一个type constructor可以定义出相应的bind和unit。这下大家都满意 : 了吧。
|
c******o 发帖数: 1277 | 20 我想了一下,有好几个办法,比如说
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,可以比较自然好看的实现你要做的事
【在 p*****2 的大作中提到】![](/moin_static193/solenoid/img/up.png) : : 感觉这个更靠谱一点。我觉得说List是monadic type更恰当一点。monad应该是另外一 : 个东西。 : 现在对scala有个疑问。 : clojure的话,同一个type,比如list,我可以写很多个monad应用在list上,行为可以 : 千奇百怪。可是scala说list就是monad,我怎么搞很多个monad应用在list上呢?
|
p*****2 发帖数: 21240 | 21
嗯。我觉得还是scalaz靠谱,虽然我还没看。但是能感觉到。所以,scala这个课程上
讲monad,很多人都看不懂。我也看不懂,看了Clojure的解释才清晰起来。这个也是我
以前抱怨的,scala把OO和FP搅在一起很混乱。
【在 c******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 我想了一下,有好几个办法,比如说 : 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,可以比较自然好看的实现你要做的事
|