gpt4 book ai didi

haskell - 生成无限列表的连续成员

转载 作者:行者123 更新时间:2023-12-02 21:03:23 25 4
gpt4 key购买 nike

我有一个由此生成的无限实体列表:

entities =
let f x = x ++ "'"
in "x" : "y" : "z" : map f entities

我想定义一个函数,它在每次调用时返回一个新实体。像这样:

> nextEntity
x
> nextEntity
y
.
.
.

我想这是 State monad 的位置,但非常感谢您的指点。

一些背景:如果您尝试在 FOL 中表示自然语言句子,您需要为实体命名变量。 “约翰爱玛丽”需要两个变量(一个为约翰,一个为玛丽),“约翰给玛丽一本书”需要三个变量(约翰,玛丽,书),等等。我这里需要的是一种生成新变量的方法我在处理句子时遇到的每个“事物”的变量名称。

因此,我想要使用的函数必须跟踪已生成的函数,并在调用时返回下一个函数。

最佳答案

I would like to define a function which returns a new entity on each invokation. Like this:

由于 Haskell 是一种纯函数式编程语言,因此从定义上来说这是不可能的。任何 Haskell 函数都会为相同的参数返回相同的值。因此,没有参数的函数是常量。

I suppose this is the place for the State monad,

是的,确实如此。状态单子(monad)表示具有可以更改的某些隐藏状态的计算。使用 do 构造,您可以将有状态计算组合到共享公共(public)状态的更大计算中。特别是,每次计算都只是将新状态传递给连续的状态。

使用方法非常简单。

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

关于haskell - 生成无限列表的连续成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4459789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com