2013-04-11 37 views
17

使用帶有Identity monad的Monad變壓器而不僅僅是使用「標準」版本的變壓器,有什麼意義?帶有標識monad的Monad變壓器

它更靈活嗎?

+0

你是什麼意思的「標準」版本? – Adrian 2013-04-11 10:42:00

+0

你是什麼意思,「變壓器」的「標準」版本?通常,它是適用於身份單元的標準版本的變壓器。 – leftaroundabout 2013-04-11 10:42:01

+0

我的意思是'國家的身份'和'國家的身份'兩者在功能上是一樣的,對嗎? – 2013-04-11 10:43:35

回答

30

早在mtl 1.0,我們有兩個

newtype State s a = State { runState :: s -> (a, s) } 

newtype StateT s m a = StateT { runStateT :: s -> m (a, s) } 

然而,這意味着任何人誰不得不實施情況的東西像MonadState清盤重複勞動。

transformers(和現在停止活動monads-fdmonads-tf)羅斯帕特森決定使用的僅提供後者,並使用Identity作爲鹼單子的簡單的方法。

這導致維護mtl的實施工作量減少,並且消除了實現State monad有兩種不同方式的事實。然而,它確實使得mtl的內部難以教授,因爲您需要了解transformers版本,並且不要將簡化版本作爲訓練輪。

當舊的mtl退役並且monads-fd變成mtl 2.0時,使用現有的transformers繼續進行此設計決定。

我個人很喜歡爲了教學目的而分開單純的monad,至少在辯論的另一邊有更多的人。

+5

我完全同意教學目的。也許我們應該建立一個包含原始簡單版本的monads-teach包。 – 2013-04-11 15:37:40

11

從文檔:在計算上,沒有理由使用Identity monad,而不是簡單地將函數應用於其參數。身份monad的目的是它在monad變換器理論中的基礎性作用。應用於Identity monad的任何monad變換器都會生成該monad的非變換版本。

據我所知,通過應用身份monad從monad變壓器獲得monad的非變壓器版本正是身份monad的存在。與僅使用非變壓器單體相比,沒有優點,但有時您必須使用單體變壓器,例如,當你想使用的功能需要它。

相關問題