f# - 如何实现不定式数据结构以在 F# 中按需获取项目

标签 f#

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

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

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

let alphabet = 
            Seq.initInfinite (fun index -> 
                    let alphabet' = "abcdefghijklmnoperstuvxwz"
                    alphabet'.Chars(index % alphabet'.Length)
                ) 

我对以下语义特别感兴趣:

alphabet.next()//生成 'a' ...某个时候... Alphabet.next()//产生 'b' ...某个时候... Alphabet.next()//产生 'c' 等等

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

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

最佳答案

序列可以引用自身,那么这个怎么样?

let alphabet = 
    let alphabet' = "abcdefghijklmnoperstuvxwz" 
    let rec loop() = seq {
        yield! alphabet' 
        yield! loop()
        }
    loop()

alphabet |> Seq.take 100 |> Seq.toList

关于f# - 如何实现不定式数据结构以在 F# 中按需获取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31862403/

相关文章:

.net - F# csv 类型提供者问题

arrays - F# array_chunk 用于序列

.net - 搜索中的重要数据结构

f# - 如何在 F# 中中止 seq?

.net - 在 F# 中对序列进行类型测试,一般相等性测试

.net - F# 编译器使死对象保持事件状态

f# - 无法在 F# 中创建 ZipArchive

f# - 通过#load 引用程序集时如何获取 F# 类型提供程序的正确解析文件夹?

f# - 命名 F# 中本身就是参数的函数参数

.net-core - .Net Core SDK 中的 F# Interactive (fsi.exe) 支持 (v3.1.100.14727)