Haskell 如何更新状态monad中的部分状态?

Haskell 如何更新状态monad中的部分状态?,haskell,monads,haskell-lens,state-monad,Haskell,Monads,Haskell Lens,State Monad,我有一个类型,我想作为状态monad的一部分使用: updateInt :: Int -> State Int () updateString :: String -> State String () {-#语言模板haskell} 进口管制.镜头 数据SomeState=SomeState {u int::int, _字符串::字符串} 使…处于某种状态 我有一些函数在SomeState中的部分状态上运行。假设他们也使用状态单子: updateInt :: Int ->

我有一个类型,我想作为状态monad的一部分使用:

updateInt :: Int -> State Int ()
updateString :: String -> State String ()
{-#语言模板haskell}
进口管制.镜头
数据SomeState=SomeState
{u int::int,
_字符串::字符串}
使…处于某种状态
我有一些函数在
SomeState
中的部分状态上运行。假设他们也使用状态单子:

updateInt :: Int -> State Int ()
updateString :: String -> State String ()
在顶层,我有一个处理整个
SomeState
的函数

updateSomeState :: Int -> State SomeState ()
我想调用
updateInt
updateString
作为
updateMestate
的一部分。我觉得应该可以使用lense将SomeState单子“转换”为它的一个部分的state单子,但我不知道如何转换


非常感谢您的帮助。

我相信您可以使用
Control.Lens.zoom
中的
zoom
组合器完成此操作:

{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
import Control.Monad.State
data SomeState = SomeState { _int :: Int, _string :: String } deriving (Show)
makeLenses ''SomeState
updateInt :: Int -> State Int ()
updateInt x = id .= x
updateString :: String -> State String ()
updateString x = id .= x

updateSomeState :: Int -> State SomeState ()
updateSomeState x = zoom int (updateInt x)
GHCi: