haskell – 試圖瞭解monad變壓器產生的型別
Control.Monad.Trans.Error
提供了組合兩個單體的例子:
type ErrorWithIO e a = ErrorT e IO a ==> ErrorT (IO (Either e a))
我發現這是違反直覺的:即使ErrorT假定是包裝IO,它看起來像是將錯誤資訊注入到IO操作的結果型別中.我會預料到的
==> ErrorT (Either e (IO a))
基於“包裝”一詞的通常含義.
為了讓事情變得更加混亂,StateT做了一些:
type MyError e = ErrorT e Identity-- (see footnote) type StateWithError s e a = StateT s (MyError e) a ==> StateT (s -> ErrorT (Either e (a, s)))
狀態型別已被注入到右側,但是整體也已被包裝在一個函式中.
為了讓事情變得更加混亂,如果將單體組合在一起:
type ErrorWithState e s a = ErrorT e (State s) a ==> ErrorT (StateT (s -> (Either e a, s)))
“外”還是一個功能;它不會產生類似於e(s– >(a,s))的東西,其中狀態函式巢狀在錯誤型別中.
我確信這一切都有一些基本的邏輯一致性,但我不太明白.因此,即使我不用理解每個單體意味著什麼,我覺得很難想像將一個單體與另一個單體結合起來是什麼意思.
有人可以啟發我嗎?
(腳註:我正在組合ErrorT與Identity,以便StateWithError和ErrorWithState彼此一致,為了說明的目的,通常我只是使用StateWithError s e a = StateT s(E e e)a並放棄ErrorT層.
I find this counterintuitive: even though ErrorT is supposedly wrapping IO, it looks like the error information has been injected into the IO action’s result type.
莫納德變壓器通常不會“包裹”其適用的單體,至少沒有任何明顯的意義.把它當作“包裝”,這將意味著我的心靈的作曲家的構成,這具體在這裡沒有發生.
為了說明,狀態和可能的函子構成,擴充套件了定義,將如下所示:
newtype StateMaybe s a = StateMaybe (s -> (Maybe a, s))-- == State s (Maybe a) newtype MaybeState s a = MaybeState (Maybe (s -> (a, s)))-- == Maybe (State s a)
請注意,在第一種情況下,狀態正常,Nothing不影響狀態值;在第二種情況下,我們既有一個簡單的國家職能,也沒有任何事情.在這兩種情況下,兩個單體的特徵行為實際上都是結合在一起的.這不應該是令人驚訝的,因為畢竟,這些都是一樣的,只是通過使用一個monad作為在另一箇中使用的常規值的值.
將此與StateT進行比較也許:
newtype StateTMaybe s a = StateTMaybe (s -> Maybe (a, s))
在這種情況下,兩者編織在一起;事情以國家的正常方式進行,除非我們打了Nothing,在這種情況下計算被中止.這與上述情況截然不同,這就是為什麼單體變壓器首先存在的原因,它們天生地組合起來並不需要任何特殊的機械,因為它們彼此獨立運作.
就“外部”而言,可能有助於將“外部”變壓器視為在某種意義上,在處理monad中的值時行為“優先”的變壓器,而“內在”monad只照常看到生意.請注意,這就是為什麼IO始終是最內層的 – 它不會讓任何其他事情起作用,而假設的IOT變壓器將被迫允許包裝的monad拉取各種shenanigans,如複製或丟棄RealWorld令牌.
> StateT和ReaderT都把“內在”monad圍繞著函式的結果;你必須提供一個國家的價值或環境,才能得到變化的monad.
> MaybeT和ErrorT都將自己置於變形的monad中,確保它可以以通常的方式執行,除了可能不存在的值.
>作家是完全被動的,只是附加在monad的價值觀,因為它不會影響行為.
> ContT保持自己的事情,只通過包裝結果型別來完全處理變換的monad.
那是一個有點手的波浪,但是,呃,單變形變壓器是一種特別的和混亂的開始,唉.我不知道對於所做出的具體選擇是否有任何整潔的理論依據,除了他們工作的事實以外,還要做出你通常希望兩個單子組合(而不是組合)做的事情.
Consequently I find it difficult to think about what it means to combine one monad with another, even when I have no trouble understanding what each monad means individually.
是的,這聽起來像是期待什麼,恐怕.
http://stackoverflow.com/questions/7088085/trying-to-understand-the-types-produced-by-monad-transformers