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