gpt4 book ai didi

F# - 字符串 |联合推理

转载 作者:行者123 更新时间:2023-12-04 16:35:53 26 4
gpt4 key购买 nike

我很确定这是不可能的,但我想我会仔细检查一下。我想我是在尝试模仿 typescript 的联合类型。

我有一个类型

type StringOrInt = 
| String of string
| Int of int

然后是一个函数

let returnSelf (x: StringOrInt) = x

目前函数必须像这样调用

returnSelf (String "hello")

可以吗

returnSelf "hello"

并推断它是一个有效的 StringOrInt?

最佳答案

目前不支持开箱即用,但可以实现相当简单的通用转换方法。

给定一个示例函数:

let call v = (* v has inferred type StringOrInt *)
match v with
| String s -> printfn "called a string %s" s
| Int i -> printfn "called an int %i" i

我们最终可以这样调用它:

(* % is a unary prefix operator *)
call %"abc"
call %1

我们需要提供一些方法来告诉如何将普通的 string/int 转换为 StringOrInt 类型。这可以由示例约定调用使用:

type StringOrInt =
| String of string
| Int of int
static member inline From(i: int) = Int i
static member inline From(s: string) = String s

在这里,我们的可区分联合提供了两个负责转换的静态方法。由于它们对应于相同的命名约定,我们可以将它们与 F# 静态解析的泛型类型参数一起使用——这些是在编译时解析的泛型,不同于在运行时也存在的 .NET 泛型——来创建一个转换函数(或运算符):

(* casting operator *)
let inline (~%) (x: ^A) : ^B =
(^B : (static member From: ^A -> ^B) x)

通过这种方式,您可以在任何以静态 From 方法形式实现强制转换机制的类型上使用 % 前缀运算符。

关于F# - 字符串 |联合推理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69951571/

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