【发布时间】:2011-06-07 02:40:14
【问题描述】:
在玩过 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
错误是:
错误 FS0001:这个表达式是 预计有类型 byref 但这里有类型 '一个参考
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
我做错了什么?
【问题讨论】:
-
哎呀,我认为这是一个错误......另外,
TryParse: string -> bool * ^a不起作用。 -
这似乎已在 F# 3.0 中修复。
标签: generics f# constraints ref byref