gpt4 book ai didi

generics - 了解 F# 内联和静态解析类型参数 : F# casting example

转载 作者:行者123 更新时间:2023-12-02 14:42:16 26 4
gpt4 key购买 nike

F# 具有静态解析泛型参数的内联函数似乎与 C++ 的模板类似。然而,与 C++ 不同,您需要指定约束 - 这是如何工作的?

例如,我正在尝试实现向上转换功能,但这不起作用:

let inline myUpcast< ^a, ^b  when ^a :> ^b  > (x: ^a) :  ^b =  x

错误信息为:错误FS0698:无效约束:用于约束的类型是密封的,这意味着该约束最多只能由一个解决方案来满足。

我实际上正在尝试编写一个函数,该函数将在可以转换基础类型时转换序列(以解决缺乏协方差的问题),但以下内容也不太有效:

let inline upcastseq (xs: seq< ^a >) : seq< ^b > when ^a :> ^b = xs :?> seq< ^b >

这会导致以下警告:警告 FS0064:此构造导致代码不如类型注释指示的通用。类型变量 'a 已被限制为类型 ' ^b'。正如预期的那样,实际使用该函数并没有像希望的那样工作。

所以,我正在寻找一个函数,如果用于以协变无效的方式转换序列(因此通用参数限制),该函数将导致类型检查错误 - 这样的事情可能吗?

更一般地说,与 C++ 模板相比,静态解析类型参数有哪些限制?

最佳答案

这是不可能的,但它与静态成员约束无关。出于同样的原因,使用普通的通用约束同样注定会失败:

// doesn't work
let myUpcast<'a, 'b when 'a :> 'b) (x: 'a) : 'b = unbox (box x)

基本上,F# 不允许涉及两个不同类型参数的类型约束;它们总是被限制为相等。

查看我对 How to constrain one type parameter by another 的回答获取更多评论。

关于generics - 了解 F# 内联和静态解析类型参数 : F# casting example,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4204987/

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