haskell - State 的仿函数实例

标签 haskell

instance Functor (State s) where
  fmap f (State g) = State $ \s0 -> 
      let (a, s1) = g s0
      in (f a, s1)

它是StateFunctor的实现。我不明白它是如何工作的?特别是,使用 g 因为它是一个函数,但在我看来它不是一个函数。它只是对象(也许是函数),但我无法理解为什么它是函数。毕竟,它应该是某种状态,例如 Int

请说清楚。

最佳答案

您的状态类型看起来像:

data State s a = State (s -> (a ,s))

所以你的fmap函数应具有类型:

fmap :: (a -> b) -> (State s a) -> (State s b)

当您匹配中的输入状态值时

fmap f (State g) = State $ \s0 -> 

g是一个函数s -> (a, s)并且您需要构造 s -> (b, s) 类型之一.

(a, s1) = g s0

将输入状态应用于现有的有状态计算,绑定(bind) a结果和 s1到新的状态。然后应用 fa获取映射结果值

(f a, s1)

状态从 g 返回没有变化。

关于haskell - State 的仿函数实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36609288/

相关文章:

haskell - 使用Haskell monad“do”表示法定义语法树

haskell - 编辑 Data.Map haskell 的元素

haskell - 减少模式匹配

haskell - 为什么仿函数实现是可能的?

haskell - 如何向实例声明添加 (Vector v a) 约束?

haskell - 提取 Haskell 中的常见功能

求解实数的 Haskell 方程

haskell - ghc-mod 仅显示 *GHC info* 中的第一行

haskell - 与 show 相比,showsPrec 有哪些优势?

haskell - 将记录语法与具有多个构造函数的代数数据类型结合使用