【问题标题】:What does the get and put function do?get 和 put 函数有什么作用?
【发布时间】:2018-12-08 11:36:46
【问题描述】:

来自our lecture notes

get' state = (state, state)
put' item state = ((), item)     -- () is void value

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

-- Functions get and put:        -- (sic!)

get :: State s s
get = State get'

put :: s -> State s ()
put item = State (put' item)

我完全迷失在getput这两个函数中。

首先get的类型签名中没有箭头:

get :: State s s

什么意思?

sgetput 中的含义是什么?它们是状态吗?

【问题讨论】:

  • State a b 表示一个State,它存储a 类型的状态,并“返回”b 类型的元素,因此对于get,您查询状态,因此它返回状态,所以在这种情况下b ~ aget'put' 在幻灯片的第 32 页上定义。
  • @WillNess:嗯,我认为首先这是一个有点不幸的命名法,因为State 类型的项目本身不存储状态,它基本上是@987654339 之间的“转换” @s(可以是无操作的过渡),但不是真正的 State 本身:)。
  • @user8314628 不,它是一个函数。它是一个值。 Haskell 就是这样矛盾的。您应该在问题中包含更多代码,例如 State 的定义。
  • @user8314628 如果我做get = ["fetch", "my", "stuff"],那么get 是什么?嗯,它是一个字符串列表(或[String])。同样,您的getState s s 类型的值。或者如果我要做foo = Nothing,那么foo 将不是一个函数,而是一个Maybe s 类型的值。
  • @WillNess 绝对不是。 State s a 类型的值具有 s -> (a,s) 类型的函数,但它本身不是函数。

标签: haskell types monads state-monad


【解决方案1】:

请记住,State s a 本质上是一个函数 s -> (a, s),即一个接受状态并返回某种类型的值 a 和新状态的函数。

所以get :: State s s 是一个s -> (s, s),一个简单地返回当前状态的函数。

put :: s -> s -> ((), s) 被实现为s -> _ -> ((), s),一个接受给定状态的函数,忽略当前状态,返回给定状态,并且不产生新值。

【讨论】:

  • 但是函数s -> (s, s)“只返回”一个元组,不是吗?
  • @WillNess 是的,它返回一个元组,其中两个成员都是当前状态。这个元组的第一个成员是你可以 fmap/>>= 的值,第二个成员是正在线程化的状态,将被赋予下一个有状态的步骤。碰巧get 中的两个成员都是相同的。我们返回要 fmap 的当前状态,并将其传递给下一个有状态步骤。
  • 我试图指出答案的一部分,我认为这对新手来说会很困惑。
  • get :: State s 是一个简单地返回当前状态的函数。那么函数get不带参数返回一个值,而State s s是返回值的类型?
猜你喜欢
  • 1970-01-01
  • 2019-06-07
  • 2013-08-26
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多