了解Haskell访问器函数

Mas*_*sse 4 haskell accessor

我正在阅读Monad教程,而我现在正在阅读的是http://www.muitovar.com/monad/moncow.xhtml,但我遇到了Monad状态的问题,或者更多精确的runState访问器功能.

类型定义为

newtype State s a = State { runState :: (s -> (a,s)) } 
Run Code Online (Sandbox Code Playgroud)

它被称为例如

runState (chncasewst3 'e' 'd' 'f') False
Run Code Online (Sandbox Code Playgroud)

我不知道如何阅读第二行的定义,特别是因为"State s a"部分.如果它在"陈述一个s"的地方,我可以推断出访问者已经被'cur''与's'相提并论.

所以问题是; 如何读取类型定义,以便在这种情况下我可以看到如何调用访问器函数,如果可能的话,如何读取访问器函数本身.

sas*_*nin 13

如果您将数据类型定义为

data T a b = MkT { getA :: a, getB :: b }
Run Code Online (Sandbox Code Playgroud)

读它就像

data T a b = MkT a b
Run Code Online (Sandbox Code Playgroud)

自动定义两个辅助函数:

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

getB :: (T a b) -> b
getB (MkT _ y) = y
Run Code Online (Sandbox Code Playgroud)

当您应用getA值时T,结果是类型a.

现在你的State类型只包含一个元素,该类型是一个函数(:: s -> (a, s)).runState将type的值转换State s a为此类型的函数.

ghci> :t runState
runState :: State s a -> s -> (a, s)
Run Code Online (Sandbox Code Playgroud)

每次应用runStatetype的值时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).

进一步阅读: