gpt4 book ai didi

f# - 将 OCaml 转换为 F# : can F# map a list of values directly to a list of identifiers?

转载 作者:行者123 更新时间:2023-12-04 22:15:07 25 4
gpt4 key购买 nike

我正在将几个基于 OCaml 的模块转换为 F# 并遇到类似这样的情况

let [x; y; z] = map func1 ["a"; "b"; "c"]

在哪里 [x; y; z]是标识符列表和 map func1 ["a"; "b"; "c"]返回函数列表。

目前我将列表中的每个值分别绑定(bind)到标识符,即
let fList = map func1 ["a"; "b"; "c"]
let x = fList.[0]
let y = fList.[1]
let z = fList.[2]

标识符的使用是为了第二个功能,即
func2 x y z 

我知道我可以修改 func2 以接受一个列表,但由于 func2 实际上需要值以及每个参数的每个函数,所以它会更有效。 IE。
func2 (x g) (y h) (z i)

我一直在寻找像 OCaml 一样有效地做到这一点的方法,但结果一无所获。
我搜索了 unmap,解构,并查看了 List 的方法

F# 可以将值列表直接映射到标识符列表吗?

编辑

我正在转换的代码确实在它自己的库中定义了一个映射函数。

编辑

@OnorioCatenacci 这只是我写的一个例子,而不是试图花很多时间来创建一个真正的工作例子。真正的代码有版权,所以我不能在没有完全公开的情况下在这里使用它。我试图说明的一点是,我没有将常量值分配给标识符,而是将函数分配给标识符。我只输入了 map func1 ["a"; "b"; "c"]表明函数是根据一些输入根据需要生成的,而不是硬编码的。真实代码构建逻辑电路模拟器,返回的函数是不同的逻辑电路;认为组合器。它都是自动定理证明器的一部分。 Tomas 和 Daniel 理解了这个问题并给出了我用真实代码验证的正确答案。

换句话说 func1 "a"将使用参数 "a" 返回一个函数. map func1 ['a", "b", "c"]将返回一个函数列表。由于函数是 first-class在 F# 中,它们可以作为值返回。

最佳答案

您可以将映射应用于列表,然后使用模式匹配将元素绑定(bind)到 F# 中的标识符。语法与您编写的示例完全相同:

let [x; y; z] = List.map func1 ["a"; "b"; "c"] 

此示例的唯一问题是 F# 编译器无法静态验证结果是否为长度为 3 的列表,因此它会向您发出警告说“此表达式上的模式匹配不完整”。在此示例中,它实际上不会发生,但如果您重新定义 map错误地扔掉第一个元素,代码就会中断。

这只是一个警告,所以你可以忽略它,但如果你想避免它,你需要使用 match并在意外情况下抛出一些自定义异常:
match List.map func1 ["a"; "b"; "c"] with
| [x; y; z] ->
// Continue here if the pattern matching does not fail
func2 (x g) (y h) (z i)
| _ -> invalidOp "Pattern matching failed"

关于f# - 将 OCaml 转换为 F# : can F# map a list of values directly to a list of identifiers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10519390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com