二叉樹可以是monad嗎?

時間 2021-05-11 22:55:17

1樓:dreday

其實list也可以不是concat,也可以concat後reverse,這樣做就出現另乙個monad了。head就比較奇怪了,如果bind返回是空的話就報錯了。

我的理解是,不是二叉樹是不是monad,而是二叉樹實現了bind,fmap這兩個方法後二叉樹就是monad了。

monad其實是用來增加組合的可能性的,組合那種返回也是該monad的函式的時候不會一層套一層(拆包)。

2樓:[已重置]

現在對List的bind的定義有點不是很懂了,它的join為啥是concat而不是head

從直觀的角度來說,Maybe v、 Either a v 注意型別中的v ,他們在實際中代表的是乙個值,取出來放回去的,看著比較直觀。但是 [v]中的v,在實際中代表的是多個值(比如[1,2,3]),取出v很自然的就是遍歷(1,2,3),所以對於bind的來說也是遍歷。

join的型別定義 Monad m => m (m a) -> m a 對於[v]來說只能對[[v]]進行join操作。

當然可以,二叉樹(Tree v) 其中的v在實際中也是代表多個值,它的monad會跟list的機制一樣,不同的是v在[v]中是以鍊錶的結構儲存,在Tree a中以二叉樹的結構儲存。

3樓:Qinxiang Cao

我覺得回答說的太多可能會使題主更加困惑。所以就盡量簡要的答一答。

Monad的作用是用來表達某種型別的計算。例如你說的maybe monad表達的是可能出error的計算。那麼list monad是什麼?

他表達的是非確定性計算。例如,如果計算的結果是[1,2,3]:list nat,那麼這表達了即可能是1,又可能是2,還可能是3。

這樣的話,用concat就好理解了。假如從[1,2,3]出發分別計算出了[1,5], [2,10], [3,15],即每個初始值都產生了兩個可能的結果,那麼最終所有的可能結果自然就是[1,5,2,10,3,15]。

類似的,你要是要定義二叉樹的monad,關鍵還是想清楚:想要表達怎麼樣的計算,而不是在技術上去機械的驗證是否滿足那幾個式子。

再有,題主問為什麼list monad不能是別的樣子的。答案是未必不能,關鍵還是:你想要用另一種不同的list monad表達怎麼樣的計算。

為什麼說「滿二叉樹也是完全二叉樹」?

一名 1 先明確完全二叉樹的概念。先上圖!完全二叉樹分為樓主所說的 圖1就是了 還有一種完全二叉樹是圖2。圖2也是完全二叉樹!圖2也是完全二叉樹!圖2也是完全二叉樹!概念 完全二叉樹分為兩種,1 最後一層沒有滿,那麼最後一層的節點都得在左邊。2 最後一層滿了,那就得全滿才行,圖2。完全二叉樹就這麼個...

2021 04 11 判斷二叉樹是否是完全二叉樹?

一鯨 const completeSize node node const sl completeSize left if sl 0 return 1 const sr completeSize right if sr 0 return 1 const fl sl 1 sl const fr sr ...

delete二叉樹根節點,會一次清空二叉樹占用的記憶體嗎?

一頁書 你需要自己實現析構函式。假設你的節點定義是這樣 struct TreeNode TreeNode TreeNode if right nullptr 魚你太美 上面幾樓的答案都是錯的。其實這不就是乙個深度優先 後序遍歷訪問每乙個結點的過程嗎,只不過訪問結點的方式改成了delete而已。析構根...