F# 如何实现不定式数据结构以获取F中的随需应变项#
我需要用下面的字母来命名图中的节点。 当我创建一个新节点(按需)时,我只需要从字符集中提取第一个未使用的字母 在F#中实现这种结构/计算的最佳方法是什么?。 请注意,以下信件应按需提取 假设我有这样的不定式字母集合(这是重复的字符集合,但我们忽略它): 我特别感兴趣的是以下内容: alphabet.next()//生成“a” ... 一些时间。。。 alphabet.next()//生成“b” ... 一些时间。。。 alphabet.next()//生成“c” 等等 我一直在考虑序列、惰性列表和异步序列,但据我所知,它们不能满足我的需要。我不想也使用像Rx等复杂的库F# 如何实现不定式数据结构以获取F中的随需应变项#,f#,F#,我需要用下面的字母来命名图中的节点。 当我创建一个新节点(按需)时,我只需要从字符集中提取第一个未使用的字母 在F#中实现这种结构/计算的最佳方法是什么?。 请注意,以下信件应按需提取 假设我有这样的不定式字母集合(这是重复的字符集合,但我们忽略它): 我特别感兴趣的是以下内容: alphabet.next()//生成“a” ... 一些时间。。。 alphabet.next()//生成“b” ... 一些时间。。。 alphabet.next()//生成“c” 等等 我一直在考虑序列、惰性列表
我怀疑它可以很好地用惰性函数、状态单子或类似的东西来实现,但不知道如何以功能的方式将各个部分连接在一起事实上,如果你需要不断地从foreach之类的东西中拉出,你的
字母表
序列就非常接近了,但如果你需要不断地拉出,它可能会附加很多开销
那怎么办
let pullNext =
let cs = "abcdefghijklmnoperstuvxwz"
let i = ref 0
fun () ->
let c = cs.[!i]
i := (!i + 1) % cs.Length
c
这将给你(我认为)你想要的:
> pullNext ();;
val it : char = 'a'
> pullNext();;
val it : char = 'b'
> pullNext();;
val it : char = 'c'
当然,这不是纯粹的(也没有使用太多的一元魔法),也不是很实用,但遗憾的是,你的字母表。next()
无论如何都不能是纯粹的函数
小心
这不是线程安全的,因此如果需要,请在内部函数中使用锁序列可以引用自身,那么这个如何
let alphabet =
let alphabet' = "abcdefghijklmnoperstuvxwz"
let rec loop() = seq {
yield! alphabet'
yield! loop()
}
loop()
alphabet |> Seq.take 100 |> Seq.toList
我喜欢!当我使用f#4.0时,我甚至可以省略'ref'调用。也许它不纯洁,但至少它是清楚的
let alphabet =
let alphabet' = "abcdefghijklmnoperstuvxwz"
let rec loop() = seq {
yield! alphabet'
yield! loop()
}
loop()
alphabet |> Seq.take 100 |> Seq.toList