Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何实现不定式数据结构以获取F中的随需应变项#_F# - Fatal编程技术网

F# 如何实现不定式数据结构以获取F中的随需应变项#

F# 如何实现不定式数据结构以获取F中的随需应变项#,f#,F#,我需要用下面的字母来命名图中的节点。 当我创建一个新节点(按需)时,我只需要从字符集中提取第一个未使用的字母 在F#中实现这种结构/计算的最佳方法是什么?。 请注意,以下信件应按需提取 假设我有这样的不定式字母集合(这是重复的字符集合,但我们忽略它): 我特别感兴趣的是以下内容: alphabet.next()//生成“a” ... 一些时间。。。 alphabet.next()//生成“b” ... 一些时间。。。 alphabet.next()//生成“c” 等等 我一直在考虑序列、惰性列表

我需要用下面的字母来命名图中的节点。 当我创建一个新节点(按需)时,我只需要从字符集中提取第一个未使用的字母

在F#中实现这种结构/计算的最佳方法是什么?。 请注意,以下信件应按需提取

假设我有这样的不定式字母集合(这是重复的字符集合,但我们忽略它):

我特别感兴趣的是以下内容:

alphabet.next()//生成“a” ... 一些时间。。。 alphabet.next()//生成“b” ... 一些时间。。。 alphabet.next()//生成“c” 等等

我一直在考虑序列、惰性列表和异步序列,但据我所知,它们不能满足我的需要。我不想也使用像Rx等复杂的库


我怀疑它可以很好地用惰性函数、状态单子或类似的东西来实现,但不知道如何以功能的方式将各个部分连接在一起

事实上,如果你需要不断地从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