What is the simplest way to access data of an F# discriminated union type in C#?

前端 未结 7 1222
耶瑟儿~
耶瑟儿~ 2020-12-10 01:23

I\'m trying to understand how well C# and F# can play together. I\'ve taken some code from the F# for Fun & Profit blog which performs basic validation returning a discr

7条回答
  •  借酒劲吻你
    2020-12-10 01:42

    I had this same issue with the Result type. I created a new type of ResultInterop<'TSuccess, 'TFailure> and a helper method to hydrate the type

    type ResultInterop<'TSuccess, 'TFailure> = {
        IsSuccess : bool
        Success : 'TSuccess
        Failure : 'TFailure
    }
    
    let toResultInterop result =
        match result with
        | Success s -> { IsSuccess=true; Success=s; Failure=Unchecked.defaultof<_> }
        | Failure f -> { IsSuccess=false; Success=Unchecked.defaultof<_>; Failure=f }
    

    Now I have the choice of piping through toResultInterop at the F# boundary or doing so within the C# code.

    At the F# boundary

    module MyFSharpModule =
        let validate request = 
            if request.isValid then
                Success "Woot"
            else
                Failure "request not valid"
            
        let handleUpdateRequest request = 
            request
            |> validate
            |> toResultInterop
    

    public string Get(Request request)
    {
        var result = MyFSharpModule.handleUpdateRequest(request);
        if (result.IsSuccess)
            return result.Success;
        else
            throw new Exception(result.Failure);
    }
    

    After the interop in Csharp

    module MyFSharpModule =
        let validate request = 
            if request.isValid then
                Success "Woot"
            else
                Failure "request not valid"
            
        let handleUpdateRequest request = request |> validate
    

    public string Get(Request request)
    {
        var response = MyFSharpModule.handleUpdateRequest(request);
        var result = Interop.toResultInterop(response);
        if (result.IsSuccess)
            return result.Success;
        else
            throw new Exception(result.Failure);
    }
    

提交回复
热议问题