繁体   English   中英

了解Haskell访问器函数

[英]Understanding Haskell accessor functions

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

类型定义为

newtype State s a = State { runState :: (s -> (a,s)) } 

它被称为例如

runState (chncasewst3 'e' 'd' 'f') False

我不知道如何阅读第二行的定义,特别是因为“State sa”部分。 如果它在“状态为”的地方,我可以推断出访问者已经被'cur''与'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类型。

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

ghci> :t runState
runState :: State s a -> s -> (a, s)

每次将runState应用于类型State sa的值时,结果都是类型为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)

进一步阅读:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM