// Open file ({ st-6ren">
gpt4 book ai didi

f# - 为什么这个 F# 嵌套匹配表达式不能正常工作?

转载 作者:行者123 更新时间:2023-12-05 00:58:16 24 4
gpt4 key购买 nike

现在,我有一个行为奇怪的嵌套模式匹配。

这是代码片段

match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt)
| _ -> (state, "") // Ignore invalid option

不幸的是,当我编译上面的代码时,我收到了两个警告。一种说法是最终的通配符模式无法访问。另一个声明第一个匹配语句不完整。

这两个警告似乎相互冲突,如果我添加括号使表达式更清晰,警告就会消失并且我的代码可以正常工作。
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
( match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt) )
| _ -> (state, "") // Ignore invalid option

我的问题是:原始代码有什么问题?这不是括号错位的情况,对于编译器来说每个匹配结束的地方似乎应该是显而易见的。

编辑:这是完整的功能,以防万一
let process_args argv =
let (result, _) = ((default_settings, "-f"), argv) ||>
Array.fold (fun (state, setting) elem ->
match setting with
| "-f" | "--file" -> // Open file
({ state with file = Some (cur_dir + "\\" + elem) }, "")
| "" -> // Option without parameter
match elem with
| "-h" | "--help" -> // Display help message
({ state with help = true }, "")
| "-r" | "--readonly" -> // Open with readonly
({ state with readonly = true }, "")
| opt -> (state, opt)
| _ -> (state, "") // Ignore invalid option
) in
result

我还应该注意到,这个错误在轻量级和冗长的语法中都会发生。

Edit2:我错误地粘贴了一个稍微改变的函数,这导致了一些编译错误而不仅仅是警告。我很抱歉。

最佳答案

当我将您的完整函数复制到 VS Code 中时,出现两个错误,都是由相同的缩进错误引起的:

let process_args argv =
let (result, _) = ((default_settings, "-f"), argv)
||> Array.fold (fun (state, setting) elem ->
// (snip rest of function)

这两个错误在 let 上的 let (result, _) = ... ,并在 ||>运算符(operator)。 let 上的错误是:

Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword.



以及 ||> 上的错误是:

Unexpected infix operator in binding. Expected incomplete structured construct at or before this point or other token.



这两个错误实际上都无助于帮助您找出问题所在,因为实际原因是您在使用 ||> 时出现了一个简单的缩进错误。运算符(operator)。

根据 F# code formatting guidelines ,“管道”运算符( |>||> 等)需要在与它们所操作的表达式相同的级别缩进。在您的代码中, ||>运算符在 (result, _) 下缩进元组。但那个元组实际上并不是 ||>是用来操作的;该元组是赋值的目标。 ||>的表达式正在运营的是 ((default_settings, "-f"), argv)元组。所以你应该像这样缩进你的代码:
let process_args argv =
let (result, _) = ((default_settings, "-f"), argv)
||> Array.fold (fun (state, setting) elem ->
// (snip rest of function)

要不然:
let process_args argv =
let (result, _) =
((default_settings, "-f"), argv)
||> Array.fold (fun (state, setting) elem ->
// (snip rest of function)

第二个更好,恕我直言。

关于f# - 为什么这个 F# 嵌套匹配表达式不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38965302/

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