理解Haskell访问器函数
我正在阅读Monad教程,我现在正在学习的是,但是我遇到了状态Monad的一个问题,或者更准确地说是运行状态访问器函数的问题 该类型定义为理解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” 所以
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)