我想通過基於現有的設計實現我自己的小型庫來了解monad變壓器。 我卡在的是語言擴展。在MonadError中,提到的唯一擴展是UndecidableInstances。但是,如果不使用FunctionalDependencies和FlexibleInstances,我無法獲得類似的代碼。 的例子,我相信需要FunDeps: class (Monad m) => MonadError e m |
爲什麼Haskell中有兩種不同的Writer類型monad?直觀地看,讀「嚴格的作家monad」意味着<>是嚴格的,所以在日誌中沒有thunk積累。然而,看源代碼,事實證明,這是不是這樣的: -- Lazy Writer
instance (Monoid w, Monad m) => Monad (WriterT w m) where
-- ...
m >>= k = WriterT $
寫在這個方便的do-notation,這似乎很清楚。但我似乎無法得到使用>>=工作的脫糖版本,這是令人不安的。有人可以用擴展的符號重寫這些嗎? 沒有嵌套 stack1 :: StateT Int Identity (Int, Int)
stack1 = do
a <- get
put (a + 1)
b <- get
return (a, b)
run
比方說,我有一個monadT: type Wrap a = ReaderT Env (StateT Int (StateT Int Identity)) a
這裏要注意的重要一點是,一個StateT被包裝另外,兩者都包裹第三MonadT,即ReaderT內。 和便利相應runWrap功能: type Env = Map.Map Char Integer
runWrap :: Env ->
這將是一個漫長的過程,因爲我不確定我是否在正確的思維框架下進入了這一過程,所以我將在每一步的過程中儘可能清晰地概述我的想法。我有兩個儘可能小的代碼片段,因此可以隨意使用這些代碼片段。 我開始用一個單一的變壓器FitStateT馬,剛剛成立的時候程序的狀態,並允許保存到磁盤: data FitState = FitState
newtype FitStateT m a = FitStateT (S
錯誤: maybet.hs:8:14:
Couldn't match expected type `MaybeT m0 t0'
with actual type `Maybe a0'
In the return type of a call of `M.lookup'
In a stmt of a 'do' expression: m <- M.loo