gpt4 book ai didi

.net - 了解 F# 类型构造函数

转载 作者:行者123 更新时间:2023-12-02 08:29:31 25 4
gpt4 key购买 nike

我正在尝试创建一个复杂的类型,并且需要在构造时执行一些操作。所以我开始编写我的代码:

type public MyType =
val private myvar: int
val private myvar2: string
(* ...Some val declarations... *)
new () = {
(* The default ctor makes something *)
}
new (ctorpar: AnotherType) = {
myvar = 1;
myvar2 = "Hello";
(* Other assignments in the form var = val *)
(* Here I would like to start a cycle in order *)
for i in ctorpar.array do
(* Do something *) (* ERROR *)
}

当尝试在赋值中放置 for 或其他内容时,编译器会发疯。我假设如下: new 的语法遵循计算表达式之一,或者更好的是, new 是一个计算表达式(我暗示这一点是因为大括号和从一个指令到另一个指令的分号)。在这种情况下,对于构造函数计算表达式,可以仅放置赋值。

请您回答我:

1)我的推论正确吗? (关于计算表达式和类型的构造函数)。

2) 如果我需要在构造函数中放置一组要执行的铰接指令,我该怎么办???你知道,有时需要在构建时执行某个操作,并且它可能涉及从循环到所有可能性的所有内容。

但是编译器无论如何都会生气......

感谢 kvd,我明白我可以执行以下操作:

type public MyType =
val private myvar: int
val private myvar2: string
(* ...Some val declarations... *)
new () = {
(* The default ctor makes something *)
}
new (ctorpar: AnotherType) =
for i in ctorpar.ACollection do
(* Something *)
{
myvar = 1;
myvar2 = "Hello";
}

抱歉,但这对我没有帮助,因为 F# 编译器告诉我:

Object constructors cannot directly use try/with and try/finally prior to the initialization of the object. This includes constructors such as 'for x in ...' that may elaborate to uses of these constructs. This is a limitation imposed by Common IL.

好的,如果问题是在对象初始化之前执行某些操作,并且听起来正确,那么让我们在之后执行此操作:

type public MyType =
val mutable private myvar: int
val mutable private myvar2: string
(* ...Some val declarations... *)
new () = {
(* The default ctor makes something *)
}
new (ctorpar: AnotherType) =
{
myvar = 1;
myvar2 = "Hello";
}
then
for i in ctorpar.ACollection do
(* Something *)
myvar <- 10

再次因失败而沮丧:

The value or constructor 'myvar' is not defined.

我该怎么办???看来之后,它无法识别我的类中的元素,这似乎是正确的,因为在使用 self 或 this 声明成员时需要一个标识符...这里它没有 self 引用,并且正确地告诉我:“你试图得到我无法给你的东西!!!!!!”

最佳答案

  1. 不,你的推论不正确。大括号更像是一个记录构造表达式,它只能包含字段赋值。 除了为大括号内的每个字段分配值之外,您不能执行任何操作。

  2. 您可以照常将语句放在字段赋值之前(即左大括号之前)。如果您随后希望执行其他语句,则需要使用 then关键字:

    type public MyType =
    val private myvar: int
    val private myvar2: string

    new () =
    for i in 1 .. 10 do
    printfn "Before field assignments %i" i
    { myvar = 1; myvar2 = "test" }
    then
    for i in 1 .. 10 do
    printfn "After field assignments %i" i

编辑

关于您的新问题,您可以使用 new (ctorpar:AnotherType) as this = ...然后this.myvar <- 10 .

关于.net - 了解 F# 类型构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5008910/

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