gpt4 book ai didi

generics - 具有特定属性的记录类型的F#类型约束

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

我正在尝试创建一个通用函数,该函数需要其type参数为记录类型,并且具有特定的属性。这是生成相关编译器错误的示例:

let foo<'a> (a : 'a) =
a' = { a with bar = "baz" }
a'

编译这个我得到一个错误,指出 The record label bar is not defined

我尝试添加以下类型约束:
let foo<'a when 'a : (member Id : string)> =
// ...

但这也没有编译,提示 This code is not sufficiently generic. The type variable ^a when ^a : (member get_Int : ^a -> string) could not be generalized because it would escape its scope.
有没有一种方法可以指定类型约束,让我正确地做到这一点?

最佳答案

我建议先阅读Tomas的答案。通常应尽可能避免使用静态解析的类型约束。它们是F#编译器的功能,而不是.NET的功能,因此它们在一定程度上限制了代码的可重用性。也就是说,它们非常强大,并且确实允许您在编译时施加有用的约束。

使用它们的语法也不尽如人意,但是如果您不惧怕,则可以执行以下操作:

type Test = {Bar : string}

let inline foo (a : ^a) =
"foo " + ((^a) : (member Bar : string) (a))

let foobar = foo {Bar = "bar"} // prints "foo bar"

但是请注意,您实际上不能将类型限制为记录,仅是具有 Bar类型的成员 string的东西。因此,这也可以解决:
type Test2(str : string) = member this.Bar = str

let foobar2 = foo (Test2("bar")) // prints "foo bar"

关于generics - 具有特定属性的记录类型的F#类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274881/

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