大部分的Monad教程都錯了

更新於 2024/11/23閱讀時間約 3 分鐘

學習 Functional Programming 時的第一個難關就是 Monad

一般的教程都是把回傳 Monad 的函式解釋成「帶有 side effect 的函式」

然而我認為這是不合適的詮釋

也不會幫助初學者理解 (至少對我來說就是如此)

例如 List Monad 常被解釋成有多種可能的結果的 Monad

所以它的 side effect 是「多種可能的結果」?

這樣描述只會讓初學者更不懂


在更進一步討論之前

我們得先釐清何謂 side effect

這個詞主要是描述相對於 pure function 的概念

pure function 不允許在運算時對環境造成影響或被環境影響

傳入相同的參數就應該得到相同的結果

因此改變運算順序不會影響輸出結果

反之帶有 side effect 的函式指的就是會對環境造成影響的函式

例如 print(message), setValue(value), toggle(checkbox) 這類的函式

或者更應該稱呼其為「程序」

因為他們做的不只是做某種計算, 還會執行某種操作

不如說執行某種操作才是這些函式的主要目的

因此改變順序可能會造成未預期的結果

pure function 和 side effect 描述的就是這種差異


所以用這種 side effect 的概念對 Monad 的詮釋是否合適?

IO Monad 可以理解成會「輸入輸出到外部終端」的函式

它可以藉由跟外界互動做出不同的行為

因此非常適合用 side effect 詮釋

State Monad 可以理解成會「改變狀態」的函式

根據狀態會有不同的結果

因此也非常適合用 side effect 詮釋

Maybe Monad 則可以理解成「可能會失敗」的函式

這部份比較奇怪

畢竟函式失敗了就不會有回傳值了

但「可能會失敗」好像也可以說是一種 effect:

它似乎是一種可以拋出例外的程序

List Monad 就更迷了

若是把它理解成「有多種可能結果」的函式

它是一種執行什麼操作的程序?

什麼樣的操作會產生多種結果? 量子疊加? 多重宇宙?


上面對 side effect 的定義有一個重要的特性: linearity

帶有 side effect 的函式不應改變輸出結果的型別和乘數

它會輸出什麼樣的東西不應受到 side effect 的影響

我們一般不會預期一個「帶有某些效果的函式」的輸出結果與其宣告不同

因此 Maybe Monad, List Monad 不應用 side effect 詮釋

他們不是造成某些效果, 而是直接影響 control flow 的結構

我們會認為 Maybe Monad 用 side effect 詮釋說的通

是因為我們已經習慣 try catch 例外處理的 pattern

try catch 本身就是非常奇怪的語言特性, 不應把它當作理所當然


帶有 side effect 的函式的確是一種 Monad

然而用 side effect 的概念囊括所有的 Monad 就有點牽強

事實上 Monad function 只是一個數學結構

描述的是所有行為像 function 的東西

硬要給所有這類東西安上一個統一的直觀概念就很奇怪

與其用統一的方式去理解所有 Monad

不如單獨理解每個 Monad 的語意

或是好好地從數學結構去理解 Monad

avatar-img
4會員
28內容數
這不是教你如何從物件導向到函數式編程的入門教程。我會深入探討物件導向與函數式編程的差異,並討論為什麼你應該使用函數式編程並徹底放棄物件導向。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
have bear的沙龍 的其他內容
'方格子在 linux/firefox 上的 bug 超煩 '若在每行第一句打中文會被吃掉 'Ctrl+V還會複製貼上之後的文字貼上之後的文字
'方格子在 linux/firefox 上的 bug 超煩 '若在每行第一句打中文會被吃掉 'Ctrl+V還會複製貼上之後的文字貼上之後的文字
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
焦慮和煩惱的根源在於我們常常想得太多,卻做得太少。這篇文章探討了思考與行動之間的落差,並提出透過小行動來減少焦慮的有效策略。我們將分享具體的步驟,幫助你開始行動,提升自信,並最終改善心理健康,過上更充實的生活。
Thumbnail
#人性原則 1.「人性上」所有人都是先為自己著想 2. 「人性上」所有人都是慣性行為、慣性認知
有許多專家或成功人士用各種途徑教導、傳授、指引關於成功或心想事成的方法,看看我們的書架上,也絕對不只一本這類型的書,因為渴望成為更好更強的人,過上更好生活的期待,是人的天性。 但事實上,97%的人都失敗了!也就是說,就算已經有不少人都實證過是有用的方法,也不是你我能成功的保證,意思是能適用於他與她
Thumbnail
這幾年身心靈領域蓬勃發展,我也努力的接觸不同的事物。今日我參加了一個身心靈市集,並體驗阿卡西療癒,這不是我第一次體驗阿卡西,但方式和過去的不同,讓我大開眼界,過去是療癒師開通道幫我看,回答我的問題,雖然很多東西無法驗證,但卻讓我釋放了某些深藏已久的煩惱。 不過我對阿卡西仍有疑慮,雖然很準、很有
今天要談的內容,主要是我一直在想,目前在用筆電的時候,喝完的容器,一直在堆的原因。 我想,對我而言,大部分的情況,以區別緊急和重要,我反而覺得沒有在乎。 沒有在乎的原因? 真的要說,主要是因為我覺得,完全沒有任何的動機,引起我去進行喝完立刻處理的事實。 甚至,這有規定嗎? 我想,也有星星兒
Thumbnail
為了解決一個問題,你買一個產品。這個產品甚至在你打開它之前就解決了你頭腦中的問題,就因為你買了它。
普通來說,都一致認為自閉症者聽不懂話中有話、雙關語等,這類詞。 因此,事實上,極少數的自閉症者,是沒有經過解釋,就聽得懂。 因此,在進入職場之前,能協助自閉症者用谷歌,就務必用。 用谷歌找話中有話、雙關語等的詞 事實上,用谷歌找,就用不著討論。 因為,家長遲早離開人世,加上懂得有限,因此,上谷歌就有
Thumbnail
你總是用陳述自己經歷的方式在寫你的履歷表嗎? 你總是想說,我只要把我的做了多少豐功偉業寫出來,你就符合雇主的用人需求了嗎? 我個人認為並不盡然如此喔,所以以下文章就是要告訴你,寫履歷表之前必知的2大關鍵點!!
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
焦慮和煩惱的根源在於我們常常想得太多,卻做得太少。這篇文章探討了思考與行動之間的落差,並提出透過小行動來減少焦慮的有效策略。我們將分享具體的步驟,幫助你開始行動,提升自信,並最終改善心理健康,過上更充實的生活。
Thumbnail
#人性原則 1.「人性上」所有人都是先為自己著想 2. 「人性上」所有人都是慣性行為、慣性認知
有許多專家或成功人士用各種途徑教導、傳授、指引關於成功或心想事成的方法,看看我們的書架上,也絕對不只一本這類型的書,因為渴望成為更好更強的人,過上更好生活的期待,是人的天性。 但事實上,97%的人都失敗了!也就是說,就算已經有不少人都實證過是有用的方法,也不是你我能成功的保證,意思是能適用於他與她
Thumbnail
這幾年身心靈領域蓬勃發展,我也努力的接觸不同的事物。今日我參加了一個身心靈市集,並體驗阿卡西療癒,這不是我第一次體驗阿卡西,但方式和過去的不同,讓我大開眼界,過去是療癒師開通道幫我看,回答我的問題,雖然很多東西無法驗證,但卻讓我釋放了某些深藏已久的煩惱。 不過我對阿卡西仍有疑慮,雖然很準、很有
今天要談的內容,主要是我一直在想,目前在用筆電的時候,喝完的容器,一直在堆的原因。 我想,對我而言,大部分的情況,以區別緊急和重要,我反而覺得沒有在乎。 沒有在乎的原因? 真的要說,主要是因為我覺得,完全沒有任何的動機,引起我去進行喝完立刻處理的事實。 甚至,這有規定嗎? 我想,也有星星兒
Thumbnail
為了解決一個問題,你買一個產品。這個產品甚至在你打開它之前就解決了你頭腦中的問題,就因為你買了它。
普通來說,都一致認為自閉症者聽不懂話中有話、雙關語等,這類詞。 因此,事實上,極少數的自閉症者,是沒有經過解釋,就聽得懂。 因此,在進入職場之前,能協助自閉症者用谷歌,就務必用。 用谷歌找話中有話、雙關語等的詞 事實上,用谷歌找,就用不著討論。 因為,家長遲早離開人世,加上懂得有限,因此,上谷歌就有
Thumbnail
你總是用陳述自己經歷的方式在寫你的履歷表嗎? 你總是想說,我只要把我的做了多少豐功偉業寫出來,你就符合雇主的用人需求了嗎? 我個人認為並不盡然如此喔,所以以下文章就是要告訴你,寫履歷表之前必知的2大關鍵點!!