gpt4 book ai didi

具有异常构造功能的 F# 类类型

转载 作者:行者123 更新时间:2023-12-04 23:13:02 25 4
gpt4 key购买 nike

我有一个这样定义的类类型:

type T1(?maybei1: int, ?maybei2: int) =

以下所有工作:

let t11 = T1(1, 2)
let t12 = T1(1)
let t13 = T1()

但这个没有(如预期的那样):

let tuple = (1, 2)
let t14 = T1 tuple //error: expected int but given int * int

另一方面,如果我将我的类型定义为:

type T2(i1: int, i2: int) =

然后我可以通过一个元组构造一个实例

let tuple = (1, 2)
let t24 = T2 tuple //ok

但我失去了选项:

let t22 = T2(1) //error
let t23 = T2() //error

我尝试了一个额外的构造函数:

type T3(?maybei1: int, ?maybei2: int) =
new (i1: int, i2: int) = T3(i1, i2)

type T4(i1: int, i2: int) =
new (?maybei1: int, ?maybei2: int) =

但我无法获得可以同时使用可选参数和元组进行实例化的版本。有什么想法(没有委托(delegate)、封装或继承,只有一种类型)?

编辑

Tomas Petricek 找到了一种让它发挥作用的方法;足够好。

但是,正如他也提到的,还有一些事情,恕我直言,听起来并不完全正确。例如,如果没有采用元组的重载构造函数,我们最终会出现以下情况:

let tup = (1, 2)

let t1 = T (1, 2) //ok
let t2 = T tup //error

在第一次实例化中,编译器将两个参数映射为构造函数所期望的选项类型,我希望在第二次实例化中也会发生同样的情况。有谁知道它是否有原因吗?

最佳答案

如果您添加一个重载的构造函数,该构造函数将显式元组作为其唯一参数,那么创建实例的所有方法都有效:

type T(?maybei1: int, ?maybei2: int) =
new (tup:int*int) = T(fst tup, snd tup)
member x.Values = maybei1, maybei2

T(1)
T(1, 2)
T(maybei2=2)
let tup = (1, 2)
T tup

老实说,我不完全确定将元组作为参数传递给多参数方法的规则是什么——这有点棘手。从逻辑上讲,您可以将成员视为一个元组,但这不是全部,因为可选参数和编译(它被编译为正常方法),因此行为有些微妙。但是定义一个采用元组的显式重载(将被编译为采用 System.Tuple)就可以了!

关于具有异常构造功能的 F# 类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51052596/

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