What is the correct way to call DateTime.TryParse from F#? I am trying to test some code from F# interactive and I can't figure out how to pass a mutable DateTime into the second argument by ref. What is the in/out/ref syntax in F#?
This is the method signature I'm looking at: http://msdn.microsoft.com/en-us/library/ch92fbc1.aspx?cs-save-lang=1&cs-lang=fsharp#code-snippet-1
Chris's answer is correct if you really need to pass a mutable DateTime
by reference. However, it is much more idiomatic in F# to use the compiler's ability to treat trailing out
parameters as tupled return values:
let couldParse, parsedDate = System.DateTime.TryParse("11/27/2012")
Here, the first value is the bool
return value, while the second is the assigned out parameter.
Here's how to execute DateTime.TryParse in F#:
let mutable dt2 = System.DateTime.Now
let b2 = System.DateTime.TryParse("12-20-04 12:21:00", &dt2)
Where the &
operator finds the memory address of dt2 in order to modify the reference.
Here's some additional information on F# parameter syntaxt.
Just for the sake of completeness, yet another option is to use ref cells, eg
let d = ref System.DateTime.MinValue
if (System.DateTime.TryParse("1/1/1", d)) then
// ...
I've found one more way, it seems more functional style (from https://stackoverflow.com/a/4950763/1349649 )
match System.DateTime.TryParse "1-1-2011" with
| true, date -> printfn "Success: %A" date
| false, _ -> printfn "Failed!"
Unfirtunately, I can't find any information about how it works.
I have a helper module I like to include in all my projects. I collect things like this, putting all the imperative -> functional conversions in one place for reuse:
module helper =
//if some, unwrap input and call fun
let inline ( |>- ) x f = Option.bind f x //bind f x
//if some, unwrap input, call fun, and wrap output
let inline ( |>-+ ) x f = Option.map f x
module dateTime =
let tryParse (input: string) : DateTime option =
let mutable dt = DateTime.Now
if DateTime.TryParse(input, &dt) then Some dt else None
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.