由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 大牛给讲讲monad吧?
相关主题
我对为什么使用FP的理解 (补)clojure这语言真不错
这次Scala没有入选有点意外呀大家有没有觉得Scala不如Haskell美?
看来跳了Scala的坑是对的Scala用好的关键是如何解决impurity的问题
scala和monadScala 1-star, would not program again
Scala的map和flatmap什么区别?haskell 真是逆天, 各种特殊符号都有特殊用途
大牛对Scala的type system如何评价?玩Scala需要学习Scalaz吗?
Haskell很难学。。Java 不是纯oo, oo 不是 imperative programming
想学FP最好不要从Scala开始storm俨然是下一个冉冉升起的新星啊
相关话题的讨论汇总
话题: monad话题: list话题: type话题: scala话题: clojure
进入Programming版参与讨论
1 (共1页)
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 的大作中提到】
: 除了Haskell,在其他语言,比如Scala,Clojure里用处大吗?
: 我知道for comprehension是monad, 但是,不知道它是monad也一点也不影响使用呀。
: 到底monad在Scala,Clojure里有多大的作用呀?

p*****2
发帖数: 21240
3

for 在scala里是monad的唯一表现形式吗?我怎么感觉Scala把monad在概念上给搞复杂
化了?

【在 c******o 的大作中提到】
: 我觉得作用就是你可以在一定的时候自己写。并且能确定你写的可以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 的大作中提到】
: 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 的大作中提到】
:
: )
: 我看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 的大作中提到】
: 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 的大作中提到】
:
: 我的意思是同一种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 的大作中提到】
: 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 的大作中提到】
:
: 我是说一个monad可以应用到不同的类型,比如list, vector, set。不是混着用。
: 话说我confused地地方是,Scala说list, vector, set都是monad,可是monad的定义不
: 就是return, bind两个函数吗?这个怎么联系起来?我看clojure中monad和数据类型是
: 分开的。数据类型就是list, vector, set这些,而monad就是定义两个函数。

相关主题
大牛对Scala的type system如何评价?clojure这语言真不错
Haskell很难学。。大家有没有觉得Scala不如Haskell美?
想学FP最好不要从Scala开始Scala用好的关键是如何解决impurity的问题
进入Programming版参与讨论
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 的大作中提到】
: 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 的大作中提到】
:
: 我觉得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 的大作中提到】
: 实际上不同的 function吧?
: 这几个data structure 的可能可以共通, general的不可能共通。
: Maybe monad, future monad, list monad 的 bind/return不可能是一样 implement
: 的,不然你查查
: source.

c******o
发帖数: 1277
14
我的理解是
monad -> 人
List -> 黑人
future -> 白人
.....
scala 没有费心思定义这个“人”

【在 p*****2 的大作中提到】
:
:
: 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 的大作中提到】
: 我的理解是
: monad -> 人
: List -> 黑人
: future -> 白人
: .....
: scala 没有费心思定义这个“人”

s******y
发帖数: 416
17
“是个大牛”中的“大牛”理解为形容词?有点汗

【在 b***e 的大作中提到】
: 这个思路好,然而理解是错误的。
: monad是一个形容词,不是一个名词。list是一个名词。比如我们说peking2是个大牛,
: 这个“大牛”应该理解成一个形容词,而不是一个名词。那么peking2为什么是个大牛
: 呢?因为他作为一个type constructor可以定义出相应的bind和unit。这下大家都满意
: 了吧。

p*****2
发帖数: 21240
18

你这个不是OO的inheritance吗?

【在 c******o 的大作中提到】
: 我的理解是
: 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 的大作中提到】
: 这个思路好,然而理解是错误的。
: 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 的大作中提到】
:
: 感觉这个更靠谱一点。我觉得说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 的大作中提到】
: 我想了一下,有好几个办法,比如说
: 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,可以比较自然好看的实现你要做的事

1 (共1页)
进入Programming版参与讨论
相关主题
storm俨然是下一个冉冉升起的新星啊Scala的map和flatmap什么区别?
Scala的思路大牛对Scala的type system如何评价?
functional programming?Haskell很难学。。
Learn monad in 10 minutes想学FP最好不要从Scala开始
我对为什么使用FP的理解 (补)clojure这语言真不错
这次Scala没有入选有点意外呀大家有没有觉得Scala不如Haskell美?
看来跳了Scala的坑是对的Scala用好的关键是如何解决impurity的问题
scala和monadScala 1-star, would not program again
相关话题的讨论汇总
话题: monad话题: list话题: type话题: scala话题: clojure