简而言之:在 F# 中做“递归列表理解”的最惯用的方法是什么?
更详细:正如我目前所了解到的(我是 F# 新手),我们基本上有以下工具来“构建”列表:List.map 和列表理解。恕我直言,它们或多或少都做同样的事情,它们通过“更改”给定列表的元素来生成一个列表(在理解的情况下,给定列表的形式为 [k..n])。
我想要做的是归纳建立列表(在人们问之前:除了好奇之外别无其他原因),即是否有任何内置函数具有人们对名为“List.maplist”之类的函数所期望的行为可能需要作为论据
一个函数 f : 'a List -> 'a 和一个 n : int,
返回列表
[... ; f (f []) ; f [] ] 的长度为 n。
为了说明我的意思,我自己编写了这样一个函数(作为练习)
let rec recListComprehension f n =
if n=0 then []
else
let oldList = recListComprehension f (n-1)
f (oldList) :: oldList
或者可读性差一点,但反过来又是尾递归的:
let rec tailListComprehension f n list =
if n=0 then list
else tailListComprehension f (n-1) ((f list)::list)
let trecListComprehension f n = tailListComprehension f n []
例如,可以通过以下方式生成包含前 200 个斐波那契数的列表
let fiboGen =
function
| a::b::tail -> a+b
| _ -> 1UL
trecListComprehension (fiboGen) 200
总结一下这个问题:F# 中是否有一个内置函数,其行为或多或少类似于“trecListComprehension”,如果没有,实现这种功能的最惯用方式是什么?
PS:抱歉有点冗长..