gpt4 book ai didi

generics - F#成员约束+ ^ a byref参数

转载 作者:行者123 更新时间:2023-12-04 07:59:26 24 4
gpt4 key购买 nike

在玩过F#成员约束功能并编写如下函数之后:

let inline parse< ^a when ^a : (static member Parse: string -> ^a) > s =
(^a: (static member Parse: string -> ^a) s)

很好用:
let xs = [ "123"; "456"; "999" ] |> List.map parse<int>

我正在尝试编写其他函数 tryParse,它使用静态方法 TryParse并将解析结果包装为 'a option类型,以便在F#中提供更好的支持。像这样的东西不能编译:
let inline tryParse s =
let mutable x = Unchecked.defaultof< ^a>
if (^a: (static member TryParse: string * ^a byref -> bool) (s, &x))
then Some x else None

错误是:

error FS0001: This expression was expected to have type byref<'a> but here has type 'a ref



F# ref -cells也不起作用:
let inline tryParse s =
let x = ref Unchecked.defaultof< ^a>
if (^a: (static member TryParse: string * ^a byref -> bool) (s, x))
then Some x else None

我究竟做错了什么?

最佳答案

更新

这似乎已在F#3.0中修复。

旧答案:

我同意Stephen的评论,即最有可能是错误。 Byref类型有很多限制,因此它们在成员约束方面的表现不佳对我来说并不奇怪。这是使用反射的一种(丑陋的)解决方法:

type parseDel<'a> = delegate of string * 'a byref -> bool

type Parser< ^a when ^a : (static member TryParse: string * ^a byref -> bool)> private ()=
static let parser = System.Delegate.CreateDelegate(typeof<parseDel<'a>>, typeof<'a>.GetMethod("TryParse", [|typeof<string>; typeof<'a>.MakeByRefType()|])) :?> parseDel<'a>
static member inline ParseDel = parser

let inline tryParse (s:string) =
let mutable x = Unchecked.defaultof< ^a>
if Parser<_>.ParseDel.Invoke(s, &x) then
Some x
else None

let one : int option = tryParse "1"

关于generics - F#成员约束+ ^ a byref参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4656864/

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