functional-programming - 相互递归高阶
问题描述
有没有办法使用相互递归来创建使用现有状态的状态机。
fun oneElse f xs =
case xs of
1::xs' => f xs'
| [] => true
| _ => false;
fun twoElse xs =
case xs of
2::xs' => oneElse twoElse xs'
| [] => false
| _ => false
val oneTwo = oneElse twoElse [1,2,1,2];
这是我到目前为止所拥有的,但我想要的是高阶函数采用这些通用(一个不知道下一个)状态的地方。
fun oneElse f xs = ...
fun twoElse f xs = ...
val oneTwo = oneElse (twoElse (oneElse headache) ) xs
解决方案
由于循环性,您不能直接执行此操作;oneElse
会有 typetype of twoElse -> int list -> bool
和twoElse
type type of oneElse -> int list -> bool
,所以 的类型oneElse
会是(type of oneElse -> int list -> bool) -> int list -> bool
,它会无限扩展。
但是,您可以使用标准解决方案来解决这个问题 - 添加一个间接级别。
datatype Wrap = Wrap of (Wrap -> int list -> bool)
fun oneElse (Wrap f) (1::xs) = f (Wrap oneElse) xs
| oneElse _ [] = true
| oneElse _ _ = false
fun twoElse (Wrap f) (2::xs) = f (Wrap twoElse) xs
| twoElse _ _ = false;
现在这两个函数都有 type Wrap -> int list -> bool
,可以解决。
您只需要在传递函数时包装它们,然后在应用它们之前解包。
测试:
- oneElse (Wrap twoElse) [1,2,1,2];
val it = true : bool
- oneElse (Wrap twoElse) [1,2,1];
val it = false : bool
推荐阅读
- reactjs - 如何使用
, 用于分解 Ant Design 中的组件 我想为 Ant Design Table 中的行创建一个组件,其中每个组件都有自己的状态,并基于该表显示行。可能吗?
如果可能的话,我该怎么做?一个例子会有所帮助。
我尝试了以下示例,但显示“无数据”
在 item.js 中
import Rea
- sql - 如何在连续日期中查找特定值
- python - Python 3 子进程 SIGABRT
- tensorflow - 如何将keras模型转换为tpu模型
- go - 无法弄清楚如何将缓冲区与二进制 Web 套接字一起使用
- mysql - 即使我有 Promise 和 await 值,为什么我的代码仍以异步方式运行
- git - 没有 refs 目录但带有打包 refs 文件的 Git 存储库无效
- css - SCSS,如何@extend嵌套的&符号“前缀”?
- android - 如何在许多布局中包含的页脚布局中设置点击侦听器?
- spring-integration - Spring Batch 从 2.2 迁移到 4.x(分区作业的 XML 配置)