我明白,在Haskell中,State monad非常有用,因爲沒有可變變量(除非我們在IO monad中)。 但是,斯卡拉的交易是什麼? State Monad是否適用於有可變變量的語言? 從某種意義上說,所有State Monad允許的是use some local mutable variables within the Monad context。例如: newtype Labeled a
我只是哈斯克爾單子玩弄和我不斷收到,我似乎無法修復的錯誤。我的代碼段使用狀態Monad將字符串中的前兩個字符添加到一起,並將它們作爲狀態的一部分返回。我的「放」行不斷給我的錯誤: * Non type-variable argument in the constraint: MonadState [a] m
(Use FlexibleContexts to permit this)
*
我對Haskell有點新鮮,而且我在國家monad方面遇到了一些麻煩。 我已經創建了以下類型。 Stat a有爲它創建的monoid,functor,applicative和monad實例。 「主」式的在我的計劃是動物,它有很多爭論: data Creature = Creature {
strength :: Stat Integer,
dexterity :: Stat I
在閱讀Functional Programming in Scala的第6章並試圖瞭解國家monad後,我有一個關於包裝副作用課的問題。 說我有一個班級,在某種程度上修改自己。 class SideEffect(x:Int) {
var value = x
def modifyValue(newValue:Int):Unit = { value = newValue }
}
在Haskell中狀態是monad被傳遞來提取和存儲狀態。並且在下面的兩個例子中,兩個都通過使用>>的狀態monad,並且通過函數內聯和縮減來驗證狀態確實傳遞到下一步。 然而這似乎不是很直觀。那麼這是否意味着當我想通過狀態單元時,我只需要>>(或>>=和lambda表達式\s -> a,其中s在a中不是免費的)?任何人都可以爲這個事實提供一個直觀的解釋,而不用擔心減少這個功能嗎? -- the f
從哈斯克爾功能的思考(第248): 你可以認爲State s a類型爲 type State s a = s -> (a,s)
... put :: s -> State s()
get :: State s s
state :: (s -> (a,s)) -> State s a
... state可以使用put和來定義: state f = do {s <- get; let (a
雖然試圖瞭解國家的單子和與它使用的鏡頭,我來到一個鏡頭一個簡單的計數器一個令人驚訝的瑣碎定義: self :: ASetter s s s s
self = ($)
incrementUsingLens :: State Int()
incrementUsingLens = self %= (+1)
由於 type ASetter s t a b = (a -> Identity b)
在Haskell退狀態單子,綁定的如下定義被接受: type RState s a = s -> (a, s)
bind :: RState s a -> (a -> RState s b) -> RState s b
bind sf f = \s ->
let (a, s'') = sf s'
(b, s') = f a s
in (b, s'')
我怎