monad-transformers

    7熱度

    1回答

    我想通過基於現有的設計實現我自己的小型庫來了解monad變壓器。 我卡在的是語言擴展。在MonadError中,提到的唯一擴展是UndecidableInstances。但是,如果不使用FunctionalDependencies和FlexibleInstances,我無法獲得類似的代碼。 的例子,我相信需要FunDeps: class (Monad m) => MonadError e m |

    2熱度

    1回答

    tl; dr,如何實現可以限制回溯的解析器,其中解析器是monad變換器堆棧? 我還沒有找到任何文章,博客或這種方法的示例實現;似乎限制回溯的典型方法是帶有附加構造函數的數據類型,或默認情況下回溯關閉的Parsec方法。 我目前的實現 - 使用commit組合器,見下文 - 是錯誤的;我不確定類型,它是否屬於類型類型,而我的實例不如它們應該的感覺。 任何人都可以描述如何做到這一點乾淨,或指向我的資

    7熱度

    1回答

    我打算在我的Scala代碼中開始使用Monadic風格,以用於線程狀態等。下面是合成3一元函數(僅約副作用關心)的一個簡單的例子 import scalaz._ import Scalaz._ object MonadTest { def adder(i: Int) = State[String, Int] ({str: String => (str + i.toString +

    13熱度

    1回答

    爲什麼Haskell中有兩種不同的Writer類型monad?直觀地看,讀「嚴格的作家monad」意味着<>是嚴格的,所以在日誌中沒有thunk積累。然而,看源代碼,事實證明,這是不是這樣的: -- Lazy Writer instance (Monoid w, Monad m) => Monad (WriterT w m) where -- ... m >>= k = WriterT $

    0熱度

    1回答

    寫在這個方便的do-notation,這似乎很清楚。但我似乎無法得到使用>>=工作的脫糖版本,這是令人不安的。有人可以用擴展的符號重寫這些嗎? 沒有嵌套 stack1 :: StateT Int Identity (Int, Int) stack1 = do a <- get put (a + 1) b <- get return (a, b) run

    9熱度

    1回答

    比方說,我有一個monadT: type Wrap a = ReaderT Env (StateT Int (StateT Int Identity)) a 這裏要注意的重要一點是,一個StateT被包裝另外,兩者都包裹第三MonadT,即ReaderT內。 和便利相應runWrap功能: type Env = Map.Map Char Integer runWrap :: Env ->

    3熱度

    1回答

    之上定義一個變壓器的MonadPlus實例我想定義一個monad變換器,除此之外,它還賦予一個具有錯誤功能的基本monad。如果基本monad是monadPlus的實例,則轉換後的monad應該是實例,但是我無法弄清楚如何定義MonadPlus實例,以便ErrorT轉換器將返回多個答案(如果存在多個答案)。我的兩次嘗試都在下面的代碼中。在代碼結尾處,是一個聲明,顯示如果基本monad是[],mon

    4熱度

    1回答

    這將是一個漫長的過程,因爲我不確定我是否在正確的思維框架下進入了這一過程,所以我將在每一步的過程中儘可能清晰地概述我的想法。我有兩個儘可能小的代碼片段,因此可以隨意使用這些代碼片段。 我開始用一個單一的變壓器FitStateT馬,剛剛成立的時候程序的狀態,並允許保存到磁盤: data FitState = FitState newtype FitStateT m a = FitStateT (S

    21熱度

    1回答

    我在最近的一篇博文中寫到transformers,有人問「人們用什麼做Control.Applicative.Lift?」我無法回答這個問題,所以我回應了StackOverflow的問題 - 是Control.Applicative.Lift用於? 我看到它在包中的一個示例用法,但我似乎無法完全解析它的功能。有沒有人知道野外的其他例子?

    0熱度

    1回答

    錯誤: 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