Functor实例的状态

时间:2016-04-13 20:48:01

标签: haskell

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

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

请说清楚。

1 个答案:

答案 0 :(得分:7)

看起来您的州类型如下:

min(range(len(array)), key=lambda i: abs(array[i]-some_value))

所以你的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 绑定到结果,将a绑定到新状态。然后,它将s1应用于f以获取

中的映射结果值
a

(f a, s1) 返回的状态不变。