首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#中更简单的Seq.unfold

F#中更简单的Seq.unfold
EN

Stack Overflow用户
提问于 2012-08-09 19:12:08
回答 2查看 610关注 0票数 2

有没有更简单的Seq.unfold版本,它只接受前一个元素作为状态?我知道你可以很容易地修改Seq.unfold来做这件事,但是结果不是很好读。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-09 20:14:09

我不认为有一个内置的函数可以做到这一点。

使用Seq.unfold重复相同的模式会非常烦人,但您可以很容易地使用unfold来定义一个行为如您所愿的函数,然后只需使用新函数:

代码语言:javascript
复制
module Seq = 
  let generate f v = 
    Seq.unfold (fun v -> let r = f v in Some(r, r)) v

另外,如果我想实现该模式,我可能会使用一个简单的递归序列表达式,它可能比使用Seq.unfold更容易阅读。generate函数可以像这样实现:

代码语言:javascript
复制
let rec generate f v = seq {
  yield v
  yield! generate f (f v) }

它的行为有点不同,因为它也会产生第一个值。不确定你想要什么行为。

票数 3
EN

Stack Overflow用户

发布于 2012-08-09 22:22:34

Tomas的回答是好的,但是,正如您所说的,使用Seq.unfold来做这件事很丑陋,而且,正如他所说的,他的generate函数的行为是不同的。

如果您想要与Seq.unfold相同的行为,但使用前一个元素作为状态,则应该这样做:

代码语言:javascript
复制
let rec unfold f state = 
  seq {
    match f state with
    | Some x ->
      yield x
      yield! unfold f x
    | None -> ()
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11882140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档