我有一个无限的实体列表,因此:
entities =
let f x = x ++ "'"
in "x" : "y" : "z" : map f entities
Run Code Online (Sandbox Code Playgroud)
我想定义一个函数,它在每个invokation上返回一个新实体.像这样:
> nextEntity
x
> nextEntity
y
.
.
.
Run Code Online (Sandbox Code Playgroud)
我想这是国家monad的地方,但是对指针感激不尽.
一些背景知识:如果您尝试在FOL中表示自然语言句子,则需要为实体指定变量."John loves Mary"需要两个变量(一个用于John,一个用于Mary),"John给Mary一本书"需要三个变量(John,Mary,书)等等.处理句子时遇到的每个"事物"的变量名称.
所以我想要使用的函数必须跟踪已生成的函数,并在调用时返回下一个函数.
我想定义一个函数,它在每个invokation上返回一个新实体.像这样:
由于Haskell是一种纯函数式编程语言,因此根据定义,这是不可能的.任何Haskell函数都将为相同的参数返回相同的值.因此,没有参数的函数是恒定的.
我想这是国家monad的地方,
是的,的确如此.状态monad表示一个可以改变的隐藏状态的计算.使用do构造,您可以将有状态计算组合到共享公共状态的较大计算.特别是,每个计算只是将新状态传递给连续的状态.
但用法非常简单.
nextEntity :: State [a] a
nextEntity = do
entity:rest <- get
put rest
return entity
test = do
e1 <- nextEntity
e2 <- nextEntity
e3 <- nextEntity
return [e1, e2, e3]
res = fst $ runState test entities
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |