instance Functor (State s) where
fmap f (State g) = State $ \s0 ->
let (a, s1) = g s0
in (f a, s1)
它是State
的Functor
的实现。我不明白它是如何工作的?特别是,使用 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
到新的状态。然后应用 f
至a
获取映射结果值
(f a, s1)
状态从 g
返回没有变化。
关于haskell - State 的仿函数实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36609288/