理解Haskell访问器函数

理解Haskell访问器函数,haskell,accessor,Haskell,Accessor,我正在阅读Monad教程,我现在正在学习的是,但是我遇到了状态Monad的一个问题,或者更准确地说是运行状态访问器函数的问题 该类型定义为 newtype State s a = State { runState :: (s -> (a,s)) } 它叫e.g runState (chncasewst3 'e' 'd' 'f') False 我不知道如何理解进入第二行的定义,特别是因为“statesa”部分。如果它的位置是“stateas”,我可以推断访问器已经被“远”到“s” 所以

我正在阅读Monad教程,我现在正在学习的是,但是我遇到了状态Monad的一个问题,或者更准确地说是运行状态访问器函数的问题

该类型定义为

newtype State s a = State { runState :: (s -> (a,s)) } 
它叫e.g

runState (chncasewst3 'e' 'd' 'f') False
我不知道如何理解进入第二行的定义,特别是因为“statesa”部分。如果它的位置是“stateas”,我可以推断访问器已经被“远”到“s”


所以问题是,;如何读取类型定义,以便了解在这种情况下如何调用访问器函数,如果可能,如何读取访问器函数本身。

当数据类型定义为

data T a b = MkT { getA :: a, getB :: b }
读起来像

data T a b = MkT a b
自动定义两个辅助函数:

getA :: (T a b) -> a
getA (MkT x _) = x

getB :: (T a b) -> b
getB (MkT _ y) = y
getA
应用于
T
的值时,结果为
a
类型

现在,您的
状态
类型只包含一个元素,该类型是一个函数(
::s->(a,s)
runState
将类型为
states sa
的值转换为此类型的函数

ghci> :t runState
runState :: State s a -> s -> (a, s)
每次将
runState
应用于类型
states sa
的值时,结果都是类型
s->(a,s)
的函数。此函数的第一个参数是状态变量的初始值(类型为
s

在教程示例中

  • chncasewst3'e'd'f'
    具有类型
    状态布尔字符串
  • 因此,
    runState(chncasewst3'e'd'f')
    具有类型
    Bool->(String,Bool)
  • 因此,
    runState(chncasewst3'e'd'f')False具有类型
    (String,Bool)
进一步阅读: