n****1 发帖数: 1136 | 1
Monad is the bread and butter in haskell. List is an example monad, "map" is
a function over monad. Monads are warm and fuzzy things.
You are talking about metaprogramming, not FP.
Even in terms of meta programming, C++ templates is not composition-friendly
. "Concepts" is yet to be added, while haskell could manipulate asm code
directly using llvm-bind in a composable way.
example:
https://github.com/bos/llvm/blob/master/examples/Array.hs |
|
w***g 发帖数: 5958 | 2 你这个例子我很喜欢。懂haskell的觉得haskell好generic好elegant好牛B,能用纯函
数表达这么过程性的思维。不懂haskell的看了怕是只有一个感觉:这段procedural
code什么语言写的怎么这么ugly.
二重循环都上了...
一般人的思维是要实现某个任务A就用C/C++/java/python/whatever写一段程序然后通
过编译器/解释器转换成机器代码运行了事。
Haskell的思维貌似要多一步:先写一个"元"程序MetaA,这个"元"程序运行后计算出一
个目标程序(一般来说就是IO monad main),目标程序以一种非函数性的方式运行后可
以实现任务A。(Haskell程序本身并没有进行任何IO,而是把各种IO操作作为数据对象
进行计算,最后得出一个类型为IO monad的对象main,所以是纯函数的。所有的IO都要
等runtime运行main的时候才执行,但这一步已经不在函数性编程的范畴之内了。)
nod101这个例子比较有意思的是,main这个IO monad本身要实现的任务又是要产生一个
计算矩阵乘法程序并写入文件。然后Haskel... 阅读全帖 |
|
a*****e 发帖数: 1700 | 3 在 Haskell 里面也就一行:
powerset = filterM (\_ -> [True,False])
这里用到的 filterM 来自 Control.Monad 库,从它的类型基本可以推断出它的功能:
filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
也就是通过一个 monadic 的条件 (a -> m Bool),筛选列表 [a],得到结果的类型为
m [a]。
这样看,filterM 是一个非常 generic 的函数,和 powerset 八杆子打不着边,那么
最上面的定义该怎么理解呢?在 scala 里面使用 monad 应该也能给出类似的定义。
这里学 Haskell 和 Scala 的那几位,谁能解释清楚了,我打赏 50 个包子 :-)
另:goodbug 那个 java 版本是 tautology,从中学不到任何知识,没意义。
= |
|
z****e 发帖数: 54598 | 4 理解这个还是要从monad入手
monad其实就是一种aop
真正的aop要难过一般的monad
理解了aop,monad也不太难 |
|
n****1 发帖数: 1136 | 5 monad的却有不对称的问题, 但是那是由它的数学结构决定的,Haskell也没办法哦.
其实monad早就不是唯一的选择,譬如写parser,monad的限制就太强了. Alternatives有
functor/applicative functor/arrow/iterable这类的啊. 而且applicative functor
应该是对称的. 现在的parser很多用arrow, 比如hxt(xml parser).
关于do block:
haskell官方wiki里面是不鼓励大家滥用do block的, 的却, do block很多情况可以
被>>=代替.
但我个人觉得完全不是问题啊! Haskell所有东西是immutable的,也就是说referential
transparency在do block里面也能保证, 那这玩意就算再像imperative些(其实骨子里
还是FP),再丑陋些, 也不会影响逻辑或者程序的正确性吧.
换句话说,如果c语言没有指针,所以变量都是immutable,那c也是FP.
,
), |
|
t*s 发帖数: 1504 | 6 最近在学Haskell
看learn yourself a haskell七八章了。到现在为止没看到Python没有的feature.
Python里面partial, list comprehension, map, reduce, filter都有
什么Eq Ord Show这种Python也有,例如, 一个类如果定义了 __lt__ 等等就能比较
所谓Monad也是故弄玄虚,我专门去看了Philp Wadler (principle designer of
Haskell)的Monads for functional programming。Monad两个字就能解释: annotated
data. 顶多把那三个laws再加上。
Maybe有点意思,但imperative的Exceptional Handling更方便,更有效率。
最不爽的是Haskell readability sucks。
唯一Haskell比Python舒服的地方我觉得是函数定义强制
->a->a->a->b 这个背后的点子非常聪明,非常mathematically beautiful
另外就是匹配中的_符... 阅读全帖 |
|
t*s 发帖数: 1504 | 7 最近在学Haskell
看learn yourself a haskell七八章了。到现在为止没看到Python没有的feature.
Python里面partial, list comprehension, map, reduce, filter都有
什么Eq Ord Show这种Python也有,例如, 一个类如果定义了 __lt__ 等等就能比较
所谓Monad也是故弄玄虚,我专门去看了Philp Wadler (principle designer of
Haskell)的Monads for functional programming。Monad两个字就能解释: annotated
data. 顶多把那三个laws再加上。
Maybe有点意思,但imperative的Exceptional Handling更方便,更有效率。
最不爽的是Haskell readability sucks。
唯一Haskell比Python舒服的地方我觉得是函数定义强制
->a->a->a->b 这个背后的点子非常聪明,非常mathematically beautiful
另外就是匹配中的_符... 阅读全帖 |
|
d******3 发帖数: 70 | 8 刚粗略看了下Clojure,觉得在state mutation方面是比Haskell简化了。haskell里主
要还是靠monad来实现。monad是公认的难学,不过monad一旦做好了后,就使得不纯的
function具有了和纯function类似的特质,并发就变得很简单了。我总有点疑虑,
clojure的这种简化是不是还是要花一些代价的,总体来说。另外FP在把很多function
合成一个系统的时候,有type checking还是一个挺大的advantage吧。
mutation |
|
c******o 发帖数: 1277 | 9 https://www.coursera.org/course/reactive
Nov 4th 2013起7星期
这是一个非常好的课程
包括了
* state monad (基本上可以实现一切imperative programming的带状态的结构)
* property based test
* Future monad (我用的最多也是最喜欢的scala feature)
* incremental IO/Reactive stream processing (比一般IO monad好)
* Actor Model
都是我见过的FP 里最实用和神奇的东西
free, 还有证书,就是最好有一点scala的基础 |
|
c******o 发帖数: 1277 | 10 https://www.coursera.org/course/reactive
Nov 4th 2013起7星期
这是一个非常好的课程
包括了
* state monad (基本上可以实现一切imperative programming的带状态的结构)
* property based test
* Future monad (我用的最多也是最喜欢的scala feature)
* incremental IO/Reactive stream processing (比一般IO monad好)
* Actor Model
都是我见过的FP 里最实用和神奇的东西
free, 还有证书,就是最好有一点scala的基础 |
|
c******o 发帖数: 1277 | 11 呵呵大概就是为什么,scala 里一大堆monad不说自己是monad的原因了
这个课上讲了好多monad,大家听的云山雾里。
其实用就好了,打开hood看engine有时候不好 |
|
c******o 发帖数: 1277 | 12 最近自己试着实现
http://www.haskell.org/haskellwiki/Typeclassopedia
的所有结构 (在scala里),很奇妙,很提高
其实Typeclassopedia也不全, 在跟的还有
contravariant functor/bifunctor/profunctor/zipper/lens
同时学了一下 trampoline (可以完全避免各种recursive的stackoverflow,同时保持
immutable, no loop)
stream processing 的 pattern有
iteratee/pipe/conduit/machine其实那些牛的library (storm/spark etc.) 里都在用
各种结构之间的联系最有趣。
monad 是最powerful的,也是限制最大的。 怪不得能有monad的 type 都在库里实现了
monad 给你用。
FP的东西其实很多,很有用的也很多。 |
|
b***e 发帖数: 1419 | 13 从一定程度上讲,generator/yield是一个sugar。不影响node.js纯异步的特性。
我建议你做一下node.js再来讨论。你做过就知道node.js和ror/python/java相比,长
处和短处在哪里;纯异步的好处和坏处在哪里;为什么yield有用。其实node.js和
Haskell从某种程度上是相似的。Haskell一旦要做IO就要陷入monad,而且一旦陷入就出
不来。Node.js“同步”的计算其实就是纯的数学计算。一旦要做IO就要陷入CPS,而且
一旦进入CPS模式就只能一条路到底。你做Haskell应该知道CPS其实就是一个monad。在
这个理解的基础上,generator/yield可以看做是monad里的do notation。
陀, |
|
n****1 发帖数: 1136 | 14 有点奇怪, monad是functor/applicative的一种。 应该是你定义好monad, 就不用定
义functor/applicative了吧。 Monad也只需要fmap和join啊。
没学过scala, 不懂
val OptionApplicatable = new Applicative[Option]
是干啥的, 能解释下么? |
|
n****1 发帖数: 1136 | 15 虽然我不喜欢java这种“万物皆对象”的作风, 但java还是解决了很多实际问题的。
TIOBE上排第二的语言不是盖的。
"一大堆东西,什么JEE, Spring, JMS,OSGI,还有什么IOC, DI, ORM"这些很复
杂没错, 但终极原因是j2ee想要解决的问题本身就是很复杂, 与语言无关。
如果某一天其他语言/生态系统发展到了能解决类似问题的程度, 我敢打包票它们一定
实现了类似的东西。
我推崇haskell是因为熟悉Monad之后, IOC/AOP这些概念会很清晰: IOC与
Continuation Monad高度关联, AOP就是Monad Transformer. 你也很容易为啥IOC/AOP
有用处, 甚至发明自己的IOC/AOP.
Java的缺点是不容易发明这些, 譬如Spring里面IOC/AOJ的实现都需要用reflection.
但这绝不意味着其他语言不需要这些概念。
对于无需发明太多轮子的普通人来说, java是足够强大的。 |
|
n****1 发帖数: 1136 | 16 Monad这个在92年就提出来了, Haskell98标准里面那些Reader/Writer全都包括了。
也就是说90年代里haskell程序员就已经在用AOP了。 而直到现在, AOP在java/scala
都还只是库, 不是语言标准。
所以并不是haskell花了无数论文才弄出Monad, 而是人们花了无数时间才意识到他们
造出来的超级牛逼的轮子其实只是monad的特殊应用。
当然haskell本来就是理论家的试验田,无意取代主流语言, 而是提出些超前的idea,
让其他语言能借鉴下。 |
|
c******o 发帖数: 1277 | 17 unit 就是some constructor
你要自己做monad 的时候就有用了。
再比如monad transformer, 你要做个既是option,又是future的class,这时候这些知
识就有用了。
再说,作个 concurrent parser validate input, 你最好还是用 applicative
functor, 而不是monad, 这时候这些知识又有用了。 |
|
n****1 发帖数: 1136 | 18 这个我不同意, haskell也就io monad有点脏, 但至少它强烈反对滥用io monad,好的
design里面io monad一定是被压缩到最小程度的. 不像node社区认为call back理所当
然.
Golang的errror handling简直和C里面的errno没啥区别,非常落后.同时panic/recover
也是莫名其妙, 降低了代码的可预测度(本质上和exception无异). |
|
w***g 发帖数: 5958 | 19 haskell我以前玩过,不怕你们笑话,我觉得我驾驭不了monad这东西。再套上几个
monad transformer我基本上就晕了。我觉得如果一个东西我弄不懂,那么大部分人
也弄不懂,也就不要指望这个东西流行起来了。还有就是,用IO monad写出来的东西
其实从形式上看还是imperative的,这点我非常确定。
scala语法一团糟,比perl还乱。不过很接地气,容易上手。 |
|
|
a*****e 发帖数: 1700 | 21 "有side effect的话,那是有可能引起错误的" 的前提是对 FFI 的调用不加限制。
IO Monad = ST Monad + RealWorld,这是一种限制方式。
但显然有其它限制方式,在发明出 IO Monad 以前 Main 可不是现在这个 type. |
|
z****e 发帖数: 54598 | 22 顺便问你一个问题
monad是不是就是一个aspect which is monadic type
以及针对这部分的操作,也就是bind
所以monad不仅仅是一个数据结构,同时也是一个computation unit? |
|
z****e 发帖数: 54598 | 23 感觉只要是集合体,都可以flatmap操作
除非flatmap有自己一套恶心的定义
应该没有,所以其实monad就是一个通过某个参数生成一个集合
只要能做到这一步,那么这个集合就是一个monad
所以其实不仅仅是list/map/set,其他general的结构也都可以做成monad
但是一般还是list/map/set
这样理解对不对? |
|
c******o 发帖数: 1277 | 24 不是,
Map是一个monad,因为
它也能实现unit/flatMap
但是那里面的
def unit[A](a: => A): F[A]
def flatMap[A,B](ma: F[A])(f: A => F[B]): F[B]
F就是Map
上一页刚才的实现
F是List
所以才说monad是type of type of type
type (Monad) of type (List, Map) of type (List[String], List[Int], Map[
String], Map[Int]) |
|
c******o 发帖数: 1277 | 25 介于monad functor之间的是applicative,是stream processing 的重要角色。
BTW,这些都能用java实现,只是不能抽象的实现。
能实现list/stream/map monad,但是不能实现抽象的monad |
|
c******o 发帖数: 1277 | 26 从下面的code 看出。
map能对一个数据(一个List, 一个Option, 一个Future) 进行操作。
applicative (ap) 能对多个数据进行操作。
monad能对对多个数据进行操作的同时,根据数据的内容动态改变操作流程。
基本上functor (map),applicative functor (ap), monad (flatMap)的区别就是这
些。
object test {
def oneVarFunc: Int => Int = {
_ + 1
}
def twoVarFunc: (Int, Int) => Int = {
_ + _
}
def optionap[A,B](a: Option[A])(f: Option[A => B]): Option[B] =
f.flatMap(t1 => a.flatMap(t2 => Some(t1(t2))))
val x1 = Some(1)
val x2 = Some(2)
val x3 = None
//functor
def test... 阅读全帖 |
|
c*******9 发帖数: 9032 | 27 References
[1] Philip Wadler. Monads for functional programming. In Advanced Functional
Pro- gramming, First International Spring School on Advanced Functional
Programming Techniques-Tutorial Text, pages 24–52. Springer-Verlag, London,
UK (1995). http: //homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/
baastad.pdf.
[2] Saunders M. Lane. Categories for the Working Mathematician. Springer-
Verlag, New York (1998).
[3] Michael Barr and Charles Wells. Category theory - lecture notes for
ESSLLI. p... 阅读全帖 |
|
p*****2 发帖数: 21240 | 28 看来这个课程讲的是不怎么样。Scala只是50% functional,却在装纯。
That was one the worst introductions to monads I have ever seen. Having the
name flatMap for bind really hinders understanding even more as one
intuitively would assume that monads are about collections or at least
containers. But then Martin flips it around saying that flatMap is not just
for collections! Then he goes on to explain laws without much context. |
|
p*****2 发帖数: 21240 | 29
我感觉只有Haskell这么依赖monad。Clojure根本就不需要monad。文本处理,ruby应该
有优势,不过大数据的话clojure有优势呀。 |
|
w***g 发帖数: 5958 | 30 反正我花了30个小时没学会. monad还行, monad transformer就基本上不知道怎么回事
了.跟常规思维差的太远了.如果什么别的语言都没学过可能会好点.
不过Haskell确实是一个非常优雅精妙的语言. |
|
h***s 发帖数: 1716 | 31 呵呵,Monad就是折磨脑子的,原因就是把数学里抽象的那一面给整进来了。我的经验
是,先别去化时间钻抽象的那一面,把monad当作定义好了interface的container看待
,map/filter的应用和其他container“一样”看待。 |
|
h***s 发帖数: 1716 | 32 呵呵,Monad就是折磨脑子的,原因就是把数学里抽象的那一面给整进来了。我的经验
是,先别去化时间钻抽象的那一面,把monad当作定义好了interface的container看待
,map/filter的应用和其他container“一样”看待。 |
|
E*****m 发帖数: 25615 | 33
Monad, Monad Transformer
這個搞懂的話,應該都不難了。 |
|
n*w 发帖数: 3393 | 34 linq is monad. Do you believe monad is just syntactic sugar? |
|
E*****m 发帖数: 25615 | 35
別叫我大牛,我沒那麼厲害,我是真神。
我覺得 Haskell 真的挺難的, 沒有真的去寫個大點的東西
恐怕真的永遠都學不會, 太多觀念是別的語言裡都沒有的,
lazy, monad, monad transformer, currying, category theory...
尤其是沒搞過FP 的恐怕很難接受。
Haskell 給一般碼工用到的可能性實在很低, 雖然語言
夠成熟,速度也行, 公司真的要用 Haskell 還是頗需要勇氣的。
話說如此,學 Haskell 是對個人還是挺有幫助的。 |
|
A*******t 发帖数: 443 | 36 Haskell高级就高级在Applicative,Monad,Category,Arrow,CoMonad和Hopf Monad上
凡是没有这些的语言比如C都要第一等的。 |
|
|
|
|
a*****e 发帖数: 1700 | 40 Monad 没有任何可读性的问题,只要你深入理解了这种抽象结构的适用范围,和不适用
的范围。
Algebraic Data Type 绝对是好东西。再进一步则是各种 Category 的抽象表达,非常
强大。Monad 只是其中之一罢了。
多看一些大牛的 presentation video 吧,还有 functional pearl,都挺有意思的。 |
|
a*****e 发帖数: 1700 | 41 Monad 没有任何可读性的问题,只要你深入理解了这种抽象结构的适用范围,和不适用
的范围。
Algebraic Data Type 绝对是好东西。再进一步则是各种 Category 的抽象表达,非常
强大。Monad 只是其中之一罢了。
多看一些大牛的 presentation video 吧,还有 functional pearl,都挺有意思的。 |
|
c*********w 发帖数: 65 | 42 started on week 3 videos, so far exceeds my expectation. I believe they made
a choice in between attempting to explaining FRP and bridging the gap from
OO to FP/Scala basics. i.e. if you don't already know what a monad is, it's
not easy to follow. the problem with monad is, as soon as you kind of know
what it is, you lost the capability to explain it to someone else. |
|
c******o 发帖数: 1277 | 43 实际上不同点复杂得多。
我知道的,
第一是 函数是第一类成员,它可以象数据一样传递,函数可以接受/产生函数。(这
一点上,连scala都不是FP, 函数在scala里是class,不是数据)
第二是 需要是纯函数,不能有side effect(不光是mutable, IO也是side effect
),这一点实际几乎不可能,所以都做特殊处理和掩盖 (streaming IO process, IO
monad, State Monad etc.)。
其他的都是可添加的特性和得出的推论,不是真正的区别。
类成员可以有数据,只不过不是变量。 |
|
p*****2 发帖数: 21240 | 44
大牛说的是。我也又研究了一下。Clojure理解Monad比Scala强,感觉能理解50%以上,
但是没法彻底。想彻底只能上Haskell了。Clojure更倾向于用Macro而不是Monad。 |
|
p*****2 发帖数: 21240 | 45
我觉得热衷monad的人应该是很少数很少数的。而且这些人理解monad应该很深刻,至少
跟我差着几个level,所以也不好评论。大家看问题的角度不同,结论也会不同。从工
程的角度讲,他这片文章跟我的观点也是非常类似的。我很反对一个东西什么都做,就
像scala一样,这样就搞的异常复杂了。工具有很多种,不同的事情可以采用最适合的
工具去做,而不是一个工具什么都想通吃。这点scala就走极端了。 |
|
c******o 发帖数: 1277 | 46 well, state monad can take care of that.
If we only talk about modeling, FP is the same as OO/imperative, FP is a
COMPLETE paradigm, in that it can solve any problem that OOP/imperative can
solve.
But whether it is good to use state monad to model stateful things, is
up for debate
wasn |
|
a*****e 发帖数: 1700 | 47 底层用不用 lock 另说,但一定要支持 rollback。
和 lock 混用估计也是可以做到的,不过在 Haskell 里面,直接 STM monad 在类型上
就限制了 side effect 的种类,也不允许在 transaction 内部使用 lock。脱离开了
STM Monad,你在 transaction 外部使用什么都可以。 |
|