Skip to content

Instantly share code, notes, and snippets.

@kos59125
Created March 3, 2020 03:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kos59125/603036d06229a3274ae36f623238d5c3 to your computer and use it in GitHub Desktop.
Save kos59125/603036d06229a3274ae36f623238d5c3 to your computer and use it in GitHub Desktop.
Computation Expression with Dependency Injection
module Program
open Microsoft.Extensions.DependencyInjection
open Microsoft.Extensions.Logging
type ResultBuilder(logger:ILogger<ResultBuilder>) =
member _.Return x = Ok(x)
member _.ReturnFrom (m:Result<_, _>) = m
member _.Bind (m, f) = Result.bind f m
member _.Delay f =
match f () with
| Ok(_) as m -> m
| Error(error) as m -> logger.LogError(sprintf "Error occurred: '%A'" error); m
let services =
ServiceCollection()
.AddLogging(fun builder ->
builder
.AddFilter("*", LogLevel.Debug)
.AddConsole()
|> ignore
)
.AddSingleton<ResultBuilder>()
[<EntryPoint>]
let main argv =
use sp = services.BuildServiceProvider()
let result = sp.GetRequiredService<ResultBuilder>()
let res1 : Result<string, string> = result {
let! a = Ok("hoge")
let! b = Ok("fuga")
return a + b
}
let res2 : Result<string, string> = result {
let! a = Ok("foo")
let! b = Error("bar")
return a + b
}
printfn "%A %A" res1 res2
0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment