After some playing around F# member constraints feature and writing function like this:
let inline parse< ^a when ^a : (static member Parse: string -> ^a) > s =
(^a: (static member Parse: string -> ^a) s)
That works perfectly fine:
let xs = [ "123"; "456"; "999" ] |> List.map parse<int>
I'm trying to write other func tryParse
, that uses static method TryParse
and wraps the parse result into 'a option
type for better support in F#. Something like this doesn't compiles:
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
The error is:
error FS0001: This expression was
expected to have type
byref<'a> but here has type
'a ref
F# ref
-cells doesn't work too:
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
What am I doing wrong?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…