f# - 在 F# 中创建并使用函数注册表

标签 f#

我在当前编写的程序中经常使用当前的代码模式:

let test_titles = ["a_fault"; "b_fault"; "c_fault"]
let tests: (unit -> 'component option) list = [a_fault; b_fault; c_fault]
let test_registry = List.zip test_titles tests
let apply_test (title, test) = test () |> Option.map (fun s -> (title, s))
let result: (string * 'component) option = test_registry |> List.tryPick apply_test

拥有一个测试注册表,用于识别有故障的组件和与函数名称同名的错误类型。

  1. 是否有更好的方法来创建此 test_registry,最好不需要我手动编写测试名称(动态获取函数名称)?

  2. 一般来说,这是惯用的 F# 吗?

编辑:代码最后一行有错误。结果是使用 test_registry 而不是 tests 计算的。

最佳答案

这看起来不错,但要考虑的另一个选择是让测试知道自己的名字。现在你有(我推断)

type Test<'comp> = unit -> 'comp option

你也可以这样

type Test<'comp> = unit -> string * 'comp option

其中字符串是名称。

我不太了解您的“大局”,无法提供其他建议或知道这是否有意义。

只是把它扔在那里,如果测试是某个模块 M 的一部分,您可以巧妙地使用 (?) 运算符,以便例如M?foo 可以访问测试函数及其名称。

关于f# - 在 F# 中创建并使用函数注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3172993/

相关文章:

c# - AleaGPU C# 中的高阶函数

f# - 处理没有可变性的元组流?

f# - 如何取消装箱 F# 元组对象,其中元组具有任意数量的元素

F#/FAKE - 调用 MSBuild 时如何指定 `--platform:x64`

f# - F#中的哈希表

f# - Suave 和 Fable.Remoting 中的 MissingMethodException

filter - F# 仅过滤掉列表中的第一个匹配项

string - 字符串列表上不区分大小写的模式匹配

compiler-construction - 如何将.fs文件编译为.exe?

for-loop - For循环不推断无符号整数