【发布时间】:2018-12-08 11:36:46
【问题描述】:
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)
我完全迷失在get和put这两个函数中。
首先get的类型签名中没有箭头:
get :: State s s
什么意思?
s 在get 和put 中的含义是什么?它们是状态吗?
【问题讨论】:
-
State a b表示一个State,它存储a类型的状态,并“返回”b类型的元素,因此对于get,您查询状态,因此它返回状态,所以在这种情况下b ~ a。get'和put'在幻灯片的第 32 页上定义。 -
@WillNess:嗯,我认为首先这是一个有点不幸的命名法,因为
State类型的项目本身不存储状态,它基本上是@987654339 之间的“转换” @s(可以是无操作的过渡),但不是真正的State本身:)。 -
@user8314628 不,它是一个函数。它是一个值。 Haskell 就是这样矛盾的。您应该在问题中包含更多代码,例如
State的定义。 -
@user8314628 如果我做
get = ["fetch", "my", "stuff"],那么get是什么?嗯,它是一个字符串列表(或[String])。同样,您的get是State s s类型的值。或者如果我要做foo = Nothing,那么foo将不是一个函数,而是一个Maybe s类型的值。 -
@WillNess 绝对不是。
State s a类型的值具有s -> (a,s)类型的函数,但它本身不是函数。
标签: haskell types monads state-monad