我想创建一个数字序列,其中每个数字是它前面的所有数字加上一个随机数的总和.
我试着这样做:
let random = new System.Random()
let addRandom =
seq{let rec stepRandom acc =
let step = random.Next(0,10)
yield! acc+step //-----wont accept this
stepRandom (acc+step)
stepRandom 0 }
Run Code Online (Sandbox Code Playgroud)
问题是它不会接受递归函数内的yield.
我可以看到一个具有可变值积累的解决方案,但是如何以惯用的方式解决这个问题呢?
使用可爱的unfold功能,如何采用不同的方法:
let random = new System.Random()
let r() = random.Next(0, 10)
let s = Seq.unfold (fun acc -> Some(acc, acc+r())) (r())
Run Code Online (Sandbox Code Playgroud)
展开会从初始状态(在本例中为第一个随机数 - 第二个参数)和生成器函数(第一个参数)创建一个序列,该函数采用先前的状态并生成(1)一个新状态(在这种情况下是前一个的总和) state加上随机的)和(2)序列中的新元素(前一个状态).