Atitit 理解Monad attilax总结
?
?
?
?
Atitit 理解Monad attilax總結(jié)
?
?
但函數(shù)式編程最大的一個問題是,函數(shù)是一個數(shù)學(xué)抽象,在現(xiàn)實世界中不存在,1
那既然這樣就夠用了,還要 Monad 干嘛?Monad 的作用在這里就體現(xiàn)出來了,它就是個加強的膠水函數(shù)1
?
?
但函數(shù)式編程最大的一個問題是,函數(shù)是一個數(shù)學(xué)抽象,在現(xiàn)實世界中不存在,
它必須被模擬出來。目前為止被廣泛使用的計算機還是基于圖靈機模型,計算機的寄存器、緩存、內(nèi)存就是用來記錄狀態(tài)的。要真正懂得程序設(shè)計,必須知道沒有狀態(tài)的函數(shù)是如何在充滿狀態(tài)的計算機上實現(xiàn)的,所以還是繞不開非函數(shù)式的編程。另外絕大部分的函數(shù)式程序設(shè)計語言都不是純函數(shù)式的,出于實用性考慮都夾雜著其他語言的一些特點,并沒有完全排斥狀態(tài)。Haskell 號稱純函數(shù)式語言,用 Monad 來抽象狀態(tài),理論上可以自圓其說,但在實際使用中其實還是帶來了很多不便(于是又發(fā)明了 Monad Transformer...)。
從某種程度上說,狀態(tài)是繞不過去的,畢竟人感知到的宏觀世界就是由各種各樣有各自狀態(tài)的對象構(gòu)成。函數(shù)式編程可以幫我們避免很多用其他方式容易犯的錯誤,在很多情況下寫出更高質(zhì)量的程序,但并發(fā)帶來的復(fù)雜度并不會從根本上消失。各種編程風(fēng)格一定是互相影響推動程序設(shè)計語言的進化,沒有絕對的好壞,從 C++ 和 Java 最新標準里引入的函數(shù)式方面的功能就很容易看出這一點。比較有意思的是,OOP 最早是在 LISP 里實現(xiàn)的,而 LISP 也被很多人看做函數(shù)式編程的起始。同樣,好的程序員也會根據(jù)具體情況使用合適的編程風(fēng)格。
那既然這樣就夠用了,還要 Monad 干嘛?Monad 的作用在這里就體現(xiàn)出來了,它就是個加強的膠水函數(shù)
因為不方便。函數(shù)式編程的精髓就在于,我們可以用好多好多小小函數(shù),搭搭搭,組成一個個大函數(shù),最終寫出整個程序來。如果所有 IO 都要用上面的模型,我們就要把程序里所有需要 IO 的地方都匯總起來,輸入做成一個大數(shù)據(jù)結(jié)構(gòu),輸出做成一個大數(shù)據(jù)結(jié)構(gòu),然后再往模型上面湊,很麻煩,這不精髓。
理想的情況是這樣:
比如我們想寫一個函數(shù)
a -> c
然后手頭有兩個小函數(shù):
a -> b
b -> c
于是我們用一個膠水函數(shù)
(a -> b) -> (b -> c) -> (a -> c)
把那兩個小函數(shù)膠起來,做成我們要的
a -> c
這樣是墜好的。
Monad 的作用在這里就體現(xiàn)出來了,它就是個加強的膠水函數(shù)。IO Monad 是這些膠水之一,有了它,我們不但可以把小函數(shù)膠起來,還能在膠的同時,把他們的頭連成一個輸入流,把它們的尾巴連成一個輸出流,構(gòu)成最終的 IO 函數(shù),不用吭哧吭哧自己構(gòu)造 IO 數(shù)據(jù)結(jié)構(gòu)。
所以,Monad 膠水除了把兩個小函數(shù)頭尾相接拼起來以外,還可以趁機做些別的事情,起到封裝一部分操作的作用。不同的膠水作用不同,所以要用不同的類(IO、Maybe 等等)把這些膠水區(qū)分開來。然后,
圖解 Monad - 阮一峰的網(wǎng)絡(luò)日志.html
?
作者::?綽號:老哇的爪子claw?of Eagle?偶像破壞者Iconoclast?image-smasher
簡稱?Attilax?Akbar?阿提拉克斯?阿克巴
全名:Attilax?bin Mahmud?bin ?attila bin Solomon?Akbar?Al?Rapanui?
阿提拉克斯?本 馬哈茂德?本?阿提拉 本 所羅門?阿克巴?阿爾?拉帕努伊???
常用名:艾提拉(艾龍),???EMAIL:1466519819@qq.com
轉(zhuǎn)載請注明來源:attilax的專欄 ??http://www.cnblogs.com/attilax/
--Atiend
?
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Atitit 理解Monad attilax总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 知识 rstrip,str
- 下一篇: 基本概念学习(8000)---兼容机