gpt4 book ai didi

f# - 类型成员中的属性和 let 语句

转载 作者:行者123 更新时间:2023-12-02 07:03:33 25 4
gpt4 key购买 nike

我正在使用 FsUnit 在 F# 中编写一些单元测试,我注意到类型成员中的属性和 let 语句有一些奇怪的行为,想知道是否有人可以解释它?

如果我这样写一个测试:

[<Fact>] member test.
``Test that something works correctly`` () =

let x = 1

x + 2 |> should equal 3

我会在 Visual Studio 2012 中的“x + 2”行的第一个字符处收到错误消息:

Unexpected keyword 'let' or 'use' in expression. Expected 'in' or other token.

使用 'let ... in' 可以绕过这个错误,但如果你想使用多个,让它很快变得困惑:

[<Fact>] member test.
``Test that something works correctly`` () =
let x = 1
in x + 2 |> should equal 3

我最终发现将属性放在单独的行上也可以绕过错误:

[<Fact>]
member test.
``Test that something works correctly`` () =

let x = 1

x + 2 |> should equal 3

谁能提供任何见解,说明为什么第一个代码片段会导致错误,而其他两个代码片段却不会?

最佳答案

在第一个片段中,您实际上有两个缩进错误。第一个问题是 ''测试某些东西是否正常工作'' 应该在 member 关键字之后缩进。第二个是函数体应该在成员定义的所有行之后缩进。

如果您修复了第一个错误:

[<Fact>] member test.
``Test that something works correctly`` () =
let x = 1
x + 2 |> should equal 3

编译器会发出“可能不正确的缩进”警告,您可以通过进一步缩进函数体来解决此问题:

[<Fact>] member test.
``Test that something works correctly`` () =
let x = 1
x + 2 |> should equal 3

在第二个片段中,in 关键字的使用触发了 verbose syntax缩进不再重要。在最后一个示例中,member 恰好具有最低的缩进;你顺便有正确的缩进。

也就是说,您应该避免将成员定义分成多行。在大多数情况下,您可以只使用 let 绑定(bind)而不是更冗长的 member 绑定(bind)。

[<Fact>]
let ``Test that something works correctly``() =
let x = 1
x + 2 |> should equal 3

关于f# - 类型成员中的属性和 let 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16484463/

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