gpt4 book ai didi

f# - DU 的类型测试模式匹配

转载 作者:行者123 更新时间:2023-12-05 00:21:29 27 4
gpt4 key购买 nike

使用 DU(可区分联合类型),我如何执行类型测试模式匹配?
我有以下运行代码:

type IU =
|Int of int
|Unit of Unit

let x = IU.Int(3)
let y = IU.Unit(())
let z = [3.14]

let showI (v) =
match box v with
| :? IU ->
match v with
| Int(_) -> "an IU int"
|_ -> "not a IU.int"
|_ -> "not a IU.int"

但是我对 showI 函数中的内部匹配不满意。我更喜欢这样的:
let showI (v) = 
match box v with
| :? IU.Int -> "an int"
|_ -> "not a IU.int"

无法编译(错误:未定义 Int 类型)。

我错过了一个明显的语法吗?谢谢。

注意:showI 函数接受一个未知类型的变量;这就是臭盒子 v 的原因。

最佳答案

正如其他人指出的那样,我认为没有任何内置语言功能可以让您做到这一点。但是,您可以定义一个 active pattern执行类型测试:

let (|IsIU|_|) (candidate : obj) =
match candidate with
| :? IU as iu -> Some iu
| _ -> None

此事件模式的类型为 obj -> IU option .

您可以使用标准模式组合您自己的自定义事件模式,如下所示:
let showI = function
| IsIU (IU.Int i) -> "an IU int"
| _ -> "not a IU.int"

在本例中,自定义 IsIU事件模式已由与 IU.Int 匹配的标准标识符模式组成。案件。

这是一个示例 FSI session ,显示了 x 的用法, y , 和 z OP中给出的值:
> showI x;;
val it : string = "an IU int"
> showI y;;
val it : string = "not a IU.int"
> showI z;;
val it : string = "not a IU.int"

关于f# - DU 的类型测试模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31631002/

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