Microsoft 的当前 F# 文档似乎 缺少核心库。我能找到的唯一文档看起来很过时,并且是 2017 年的。我在谷歌搜索上花费了惊人的时间(这是 2020 年,F# 现在已经有一段时间了),试图找到 FSharpValue.MakeUnion 方法的文档,并且可以没有找到任何似乎来自马口的有用信息。
在 MS 的文档中搜索上述方法名称的方法会产生以下结果(并且 Ms docs 链接上的所有结果也不会导致任何结果):
我应该去哪里找?
我有一个表,其中包含带有组 ID 的 json 字符串。我想创建一个 json 数组,其中包含具有相同 id 的所有 json 对象。
请注意,在我的例子中,我尝试放入数组中的列内容本身就是 json 片段,因此我的案例和问题比将行转换为数组更具体。OPENJSON在接受的答案中使用也利用了这个细节。
但是,我找不到使用 FOR JSON 的方法,该方法允许我选择单个列,而该列的名称不会成为数组中所有对象的键。
我意识到我想要摆脱的键是将列投影到 json 的键值表示的键所必需的,但在这种情况下,我只选择一列,我很好奇是否有一个我不能的技巧考虑到。
我可以通过简单地使用 COALASCE 来实现我想要的目标,但我想知道是否可以使用 FOR JSON 来处理这种边缘情况。这是演示我正在尝试做的事情的简化代码:
BEGIN
declare @Json_Snippets table (id int, json nvarchar(max));
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"one"}}');
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"two"}}');
select
JSON_QUERY(js.json) as 'dont_want_this'
from
@Json_Snippets js
FOR JSON PATH;
END
Run Code Online (Sandbox Code Playgroud)
我必须使用 JSON_QUERY 来避免 json 列中的转义字符,即 json 字符串保持为 json。运行上面给出:
[{"dont_want_this":{"root":{"obj":"one"}}},{"dont_want_this":{"root":{"obj":"two"}}}]
Run Code Online (Sandbox Code Playgroud)
我想得到的是:
[{"root":{"obj":"one"}},{"root":{"obj":"two"}}]
Run Code Online (Sandbox Code Playgroud) 这个问题总是让我困惑,我无法理解 F# 编译器在这里遇到的问题。
我有两个模块的两个文件。
A.fs:
module A
//rest of the module goes here
Run Code Online (Sandbox Code Playgroud)
B.fs
module A.B
//rest of the module goes here
Run Code Online (Sandbox Code Playgroud)
当我构建这个项目时,我得到:
A.fs(1, 8): [FS0247] A namespace and a module named 'A' both occur in two parts of this assembly
为什么?除了 Program.fs 之外,项目中没有其他任何内容。我是否错误地假设我可以将模块分解为多个文件以控制一切,同时使用命名空间之类的命名方案?(显然编译器是这么认为的)。
我想了解编译器在这里遇到的问题以及为什么我会出现引用命名空间的错误,即使我的代码中没有命名空间声明。
我正在尝试对可选的元组列表使用模式匹配,但尽管尝试了我能想到的一切,但我无法编写详尽的匹配表达式。
我很难理解为什么 F# 编译器坚持认为我在以下示例中的模式并不详尽。
module Mapper.PatternMatchingOddity
type A = A of string
type B = B of string
type ProblemType = ProblemType of (A * B) list option
//Incomplete pattern matches on this expression. Some ([_;_]) may indicate a case...
let matchProblem = function
|Some [(x:A,y:B)] -> []
|Some ([_,_]) -> [] //rider says this rule will never be matched
|None -> []
//same as before
let matchProblem1 = function
|Some [_,_] -> []
|Some [] -> []
//|Some _ …Run Code Online (Sandbox Code Playgroud)