gpt4 book ai didi

types - 使用F#区分联合替代作为参数类型

转载 作者:行者123 更新时间:2023-12-04 16:40:13 24 4
gpt4 key购买 nike

我正在尝试使用已区分联合的特定成员作为参数类型。例如:

type SomeUnion =
| A of int * int
| B of string

type SomeType(A(i, j)) =
member this.I = i
member this.J = j

let a = A(10, 20)
let instance = SomeType(a)

但这是非法的语法,并且针对SomeType的参数列表提示“类型定义中的意外符号'('”)。这是有效的语法:
let doSomethingWithA (A(i, j)) = i + j

但是类型签名是 SomeUnion -> int而不是 A -> int,并且它提示模式匹配不完整(给定签名是可以理解的)。

那有可能吗?我相信F#工会成员被编译为CLR类,从理论上讲似乎可行,但是实际上(即不使用诸如反射之类的东西)吗?否则,我想您必须执行手动OOP方法,该方法比较冗长,并且不能保证完全匹配。

最佳答案

我同意您无法对匹配构造函数参数进行模式匹配是令人惊讶的。它适用于普通成员。

也许您可以在构造函数中进行显式匹配,以在值错误的情况下获取运行时错误:

type SomeType(a) =
let i, j = match a with | A(k, l) -> k, l
member this.I = i
member this.J = j

但是否则,必须理解 A而不是一种类型。因此, doSomethingWithA的类型不符合您的预期也就不足为奇了。而且您将不得不忍受不完整的模式匹配警告。

关于types - 使用F#区分联合替代作为参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14319207/

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