haskell - 了解 Haskell 访问器函数

标签 haskell accessor

我正在阅读 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 s a”部分。如果它在“State a s”的位置,我可以推断出访问器已被“curried”到“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

申请时getAT 的值,结果的类型为 a .

现在您的State type 仅由一个元素组成,该类型是一个函数 (:: 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) .

  • 进一步阅读:
  • Learn You a Haskell: Making Our Own Types and Typeclasses
  • RWH: Defining Types, Streamlining Functions
  • 关于haskell - 了解 Haskell 访问器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240947/

    相关文章:

    haskell - 在 Haskell 中使用 Maybe 类型

    haskell - 函数的模式匹配

    python - 无需 try/catch 即可安全访问 Python 中的对象

    C# 设置程序集中所有类型都可访问的访问器,并仅获取派生类型的访问器。如何?

    objective-c - 当我尝试构建这个简单的 XCode 项目时,为什么会收到 "parse error before ' @' token"?

    python - 这些 Haskell 高阶函数的 Python 等价物是什么?

    haskell - 是否可以在 CentOS 上安装 Haskell 平台?

    c++ - 通过引用访问 const 的语法

    c# - 何时以及为何使用 C# 访问器方法

    haskell - Haskell 表达学院的 Literate Haskell 源代码。困惑