recursion - 递归谓词的例子
问题描述
在 Stone 的函数式编程算法中,他给出了递归定义谓词的设计模式,在 Scheme 中是
(define (check stop? continue? step)
(rec (checker . arguments)
(or (apply stop? arguments)
(and (apply continue? arguments)
(apply (pipe step checker) arguments)))))
哪里pipe
是作者按图解顺序组合两个函数的函数,((pipe f g) x = (g (f x))
。
因此,例如,要测试一个函数是否是 2 的幂,您可以定义
(define power-of-two? (check (sect = <> 1) even? halve))
哪里(sect = <> 1)
是作者的柯里化符号,相当于lambda x: x == 1
.
很明显,很多谓词可以递归实现,但它没有用。显然有一些递归谓词不会使用这种模式,比如树上的谓词。
有哪些符合这种模式的经典谓词?我猜想测试康托集中是否有某些东西,但这与上面的几乎相同。
解决方案
目前尚不清楚您在问什么,但您的示例是使用组合器进行编程的经典示例。
组合器是作为输入函数和返回函数的函数。
组合器是函数式编程的基础。使用它们,您可以实现一切。例如,如果您将对象的数据结构定义为函数,您可以使用一些组合器组合对象并获得一个新对象。
您的示例中的组合器似乎对于检查有关某些单子组成的某些谓词很有用。
推荐阅读
- nightwatch.js - 如何通过黄瓜集成在 nightwatch.js 中运行特定功能
- python - 连接单列多个不同形状的文件
- android - 尝试在 Android Studio 中更改字体时出错
- kubernetes - 私有子网中的本地 Kubernetes 集群
- api - 如何从 Google Photos API 播放视频
- r - 高效使用 foreach 和 if 语句
- css - 当用户按住鼠标单击时应用样式?
- python - 使用 python 从 samba 复制目录/子目录中的所有文件
- android - 如何修复会话“应用程序”:安装 APK 时出错?
- networking - UDP数据包丢失 - 但没有数据包显示为在任何地方丢弃?