讀取內部
https://wiki.haskell.org/IO_inside
class Monad m where
unit :: a -> m a
bind :: m a -> (a -> m b) -> m b
我觀察到這個詞unit似乎不再使用了,pure現在是這個詞。為什么?因為我認為pure這種遞回結構是不夠的。
(>>=)在這里呼叫bind,我們怎么呼叫(>>)?
uj5u.com熱心網友回復:
該名稱pure基于這樣的想法,即 monad(或應用程式)通常代表某種有效的“不純”計算,并且如果您想使用純值/計算作為更大的不純計算中的組件,您可以將純值/計算嵌入到不純計算中pure。
例如,如果您有一些應用運算式:
f <*> a <*> b
其中f、a和b都是不純的應用計算,并且您想a用純值替換不純的計算,您可以撰寫:
f <*> pure 2 <*> b
很明顯,您將“純”值 2 或“純 2”作為第一個引數傳遞給應用函式f。
根據@chepner 的評論,該名稱unit從未在單子或應用程式的實際 Haskell 實作中使用。該名稱來自數學定義,其中 monad 可以定義為一種 monoid,“unit”操作是 monoid 的標識元素。單位元有時被稱為單位,大概是因為在實數中的乘法單位是“1”,也就是單位,也就是單位。
同樣根據@chepner,由于歷史原因,此操作有兩個 Haskell 名稱——pure一個是型別類中使用的Applicative名稱,一個是型別類return中使用的名稱Monad。對于 monad 的所有正確實作,這兩個操作做同樣的事情。選擇這個名稱return可能是因為型別的單子計算Monad m => m a是一個小“程式”,它可能會處理一些效果,然后最終回傳一個a. 如果您只想回傳一個x :: a而不處理任何效果,那么您只需return x.
運營商>>并沒有真正的正式名稱。人們通常使用“然后”或簡單地使用“然后”(請參閱??此答案)。這源于這樣的想法,當一個 monad 可解釋為一系列操作(例如, IO monad)時,效果是a >> b先做a然后做b。還有一個運算子*>做同樣的事情(同樣,主要是出于歷史原因—— >>forMonad和*>for Applicative),它通常也被稱為“then”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427250.html
標籤:哈斯克尔
