recursion - f# 生成下一个值函数
问题描述
给定一个列表 [1, 2] 我正在尝试创建一个匿名函数,该函数生成一个元组(下一个值 * 一个生成下一个值的函数)......类似于
f = createFunc([1; 2])
(v1, f1) = f() //v1 = Some 1
(v2, f2) = f1() //v2 = Some 2
(v3, f3) = f2() //v3 = None
在 Elixir 中我可以很容易地做到这一点,但在 F# 中我的头撞到了墙上。任何指点都感激不尽。到目前为止,我的尝试看起来像:
let top_and_tail (l: list<'a>): (Option<'a> * list<'a>) =
match l with
| [] -> (None, [])
| h :: t -> ((Some h), t)
let rec createFun l =
fun() ->
let (h, t) = top_and_tail(l)
(h, createFun(t))
解决方案
尝试将类型注释添加到函数的签名中。它的返回类型取决于l
. 您可以通过定义递归类型来解决它:
data Ret a =
| End of a
| KeepGoing of a * (unit -> Ret a)
推荐阅读
- emacs - Orgmode 将二级标题导出为枚举
- java - 在 Android Studio 中使用 SQLite 时出现“没有这样的列:id”
- javascript - 来自外部范围的 Javascript 函数
- java - Pure vs Impure 方法 ES6 类。我应该传递值还是应该将它们存储在对象中
- css - CSS:按钮在包含换行文本时得到偏移
- wordpress - 在 WP 中显示带有帖子的当前类别和带有帖子的子类别
- php - config/app.php 和 .env 文件中的 Laravel 应用程序环境变量
- python - bigquery python 客户端:load_table_from_file 不适用于 csv 文件
- php - 没有收到推送消息
- javascript - 防止