Last active
August 21, 2018 14:20
-
-
Save adacola/98dc5065a59c0e7eaa4e01c103acac59 to your computer and use it in GitHub Desktop.
飲酒中に書いたコードであることを表明するコンピュテーション式
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open System | |
type EthanolBuilder() = | |
let printWarning() = printfn "飲酒中に書いたコードなので危険です!" | |
member __.Bind(x, f) = printWarning(); f x | |
member __.Return(x) = x | |
member __.ReturnFrom(x) = printWarning(); x | |
member __.Using(x: #IDisposable, f) = try f x finally if x |> box |> isNull |> not then x.Dispose() | |
member __.Zero() = () | |
member __.Combine(_, f) = f() | |
member __.TryWith(f, g) = try f() with e -> g e | |
member __.TryFinally(f, g) = try f() finally g() | |
member __.For(xs, f) = for x in xs do f x | |
member __.While(c, f) = while c() do f() | |
member __.Delay(f) = f | |
member __.Run(f) = | |
printfn "ここから飲酒中に書いたコードなので危険です!" | |
let result = f() | |
printfn "ここまで飲酒中に書いたコード" | |
result | |
let ethanol = EthanolBuilder() | |
let ethanolExample() = | |
printfn "まだ飲酒してない" | |
let result = ethanol { | |
// let! や do! を使うことで警告が出せる | |
do printfn "1" | |
let! beer = 1 + 1 | |
do printfn "2" | |
use wine = { new IDisposable with member __.Dispose() = printfn "disposed" } | |
do printfn "3" | |
do! printfn "酒が飲める飲めるぞー酒が飲めるぞー" | |
do printfn "4" | |
for x in 1 .. 5 do | |
printfn "x : %d" x | |
do printfn "5" | |
let mutable y = 5 | |
do printfn "6" | |
while y > 0 do | |
printfn "y : %d" y | |
y <- y - 1 | |
do printfn "7" | |
return! beer + 2 | |
} | |
printfn "酒が抜けた" | |
result + 1 | |
(* | |
> ethanolExample();; | |
まだ飲酒してない | |
ここから飲酒中に書いたコードなので危険です! | |
1 | |
飲酒中に書いたコードなので危険です! | |
2 | |
3 | |
酒が飲める飲めるぞー酒が飲めるぞー | |
飲酒中に書いたコードなので危険です! | |
4 | |
x : 1 | |
x : 2 | |
x : 3 | |
x : 4 | |
x : 5 | |
5 | |
6 | |
y : 5 | |
y : 4 | |
y : 3 | |
y : 2 | |
y : 1 | |
7 | |
飲酒中に書いたコードなので危険です! | |
disposed | |
ここまで飲酒中に書いたコード | |
酒が抜けた | |
val it : int = 5 | |
*) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment