我正在阅读Monad教程,而我现在正在研究的是http://www.muitovar.com/monad/moncow.xhtml,但是我遇到了Monad状态的问题,或者更确切地说是runState访问器函数。< / p>
类型定义为
newtype State s a = State { runState :: (s -> (a,s)) }
它被称为例如
runState (chncasewst3 'e' 'd' 'f') False
我不知道如何阅读第二行的定义,特别是因为“State s a”部分。如果它在“陈述一个s”的地方,我可以推断出访问者已经被'cur''与's'一样“。”
所以问题是;如何读取类型定义,以便我可以看到如何在这种情况下调用访问器函数,如果可能的话,如何阅读访问器函数本身。
答案 0 :(得分:13)
如果您将数据类型定义为
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
。
现在,您的State
类型只包含一个元素,该类型是一个函数(:: s -> (a, s)
)。 runState
将类型State s a
的值转换为此类型的函数。
ghci> :t runState
runState :: State s a -> s -> (a, s)
每次将runState
应用于State s a
类型的值时,结果都是s -> (a,s)
类型的函数。并且此函数的第一个参数是状态变量的初始值(类型为s
)。
在教程示例中,
chncasewst3 'e' 'd' 'f'
的类型为State Bool String
。runState (chncasewst3 'e' 'd' 'f')
的类型为Bool -> (String, Bool)
。runState (chncasewst3 'e' 'd' 'f') False
的类型为(String, Bool)
。进一步阅读: