The problem seems to be dumb, but I really don't get it.
module Responses =
type Failure =
| Problem of string
| Error of exn
| Timeout
static member toString x =
match x with
| Problem str -> sprintf "Problem %s" str
| Error e -> sprintf "Error %s" (e.ToString())
| Timeout -> "Timeout"
override x.ToString() = Failure.toString x
error is
override x.ToString() = Failure.toString x;;
--------------------------------------^^^^^^^^
stdin(11,41): error FS0039: The field, constructor or member 'toString' is not defined
Reason is that f# for some reason thinks that Failure
is of type Microsoft.FSharp.Core.Operations.Failure
When I try to write
override x.ToString() = Responses.Failure.toString x
I get
Startup.fs(14,33): error FS0039: The namespace or module 'Responses' is not defined
When I rename Failure
to for example xFailure
, it works. But I really do not want to rename it. Can I somehow avoid renaming and use static method?
This is a bit surprising behavior! I think it is happening because Failure
is another type that is defined in the F# core library. When you try calling the static method, the compiler (for some reason) picks only the F# library type, but does not union the static methods (which is what I would expect).
I think it might be a bug - so please report it on the F# CodePlex site.
As a workaround, I only came up with a fairly ugly idea, which is to define a private type alias such as FailureStatic
and then use the alias to call static members (the users of your library will not see it).
module Responses =
type private FailureStatic = Failure
and Failure =
| Problem of string
| Error of exn
| Timeout
static member toString x =
match x with
| Problem str -> sprintf "Problem %s" str
| Error e -> sprintf "Error %s" (e.ToString())
| Timeout -> "Timeout"
override x.ToString() = FailureStatic.toString x
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With