Functional programming 从纯函数到非纯函数

Functional programming 从纯函数到非纯函数,functional-programming,state,purely-functional,Functional Programming,State,Purely Functional,我想做一个心理实验,只使用纯函数,而不使用任何赋值/单子之类的函数来创建有状态函数。例如,一种类似RS触发器的功能,具有设置和复位输入: ff(1,0) -> 1 ; SET ff(0,0) -> 1 ; just output current state ff(0,1) -> 0 ; RESET ff(0,0) -> 0 ; whoops, a side-effect! 在电子技术中,这种触发器(或任何有状态电路)是通过将电路的输出发送回输入端来实现的,即: 所以,

我想做一个心理实验,只使用纯函数,而不使用任何赋值/单子之类的函数来创建有状态函数。例如,一种类似RS触发器的功能,具有设置和复位输入:

ff(1,0) -> 1 ; SET
ff(0,0) -> 1 ; just output current state
ff(0,1) -> 0 ; RESET
ff(0,0) -> 0 ; whoops, a side-effect!
在电子技术中,这种触发器(或任何有状态电路)是通过将电路的输出发送回输入端来实现的,即:


所以,我认为函数的某种递归可以创建有状态函数,对吗?但如何处理这件事,它将是无限的?

除非你对“有状态函数”有一个不等于“不纯函数”的定义,否则你所寻求的是不可能的。您似乎想找到一种方法来破坏纯函数的引用透明性,您可以编写一个函数,该函数接受输入列表并生成输出列表。在函数式反应式编程中,它实际上是一种事件流。函数确实有状态,因此,您将实现通常所称的monad,然而,由于您要求不使用monad,您可能无法使用词法闭包作为状态,因此这项任务变得不可能。我有点希望有人能详细介绍Bergi的答案和这个SICP片段:“在本节中,我们探索一种基于称为streams的数据结构的状态建模的替代方法”。您只需要一个纯lambda演算(没有赋值)来实现惰性流,对吗?约翰和西尔维斯特认为,为什么这一切都是不可能的呢?除非你对“有状态函数”有一个不等于“不纯函数”的定义,否则你所追求的是不可能的。您似乎想找到一种方法来破坏纯函数的引用透明性,您可以编写一个函数,该函数接受输入列表并生成输出列表。在函数式反应式编程中,它实际上是一种事件流。函数确实有状态,因此,您将实现通常所称的monad,然而,由于您要求不使用monad,您可能无法使用词法闭包作为状态,因此这项任务变得不可能。我有点希望有人能详细介绍Bergi的答案和这个SICP片段:“在本节中,我们探索一种基于称为streams的数据结构的状态建模的替代方法”。您只需要一个纯lambda演算(没有赋值)来实现惰性流,对吗?约翰和西尔维斯特认为,为什么这一切都是不可能的呢?