Skip to content

Instantly share code, notes, and snippets.

@adacola
Last active July 5, 2018 03:00
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 adacola/6962e6016282cf09b99a1dc63a294c47 to your computer and use it in GitHub Desktop.
Save adacola/6962e6016282cf09b99a1dc63a294c47 to your computer and use it in GitHub Desktop.
クソコードであると表明するだけのコンピュテーション式。これ自体がクソコード
open System
type KusoBuilder() =
member __.Bind(x, f) = f x
member __.Return(x) = x
member __.ReturnFrom(x) = 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) = f()
let kuso = KusoBuilder()
let kusoExample() =
kuso {
// let! を使うことで特にここがクソ!とアピールできるがそれ以外の機能はない
let! kuso1 = 1 + 1
use kuso2 = { new IDisposable with member __.Dispose() = printfn "disposed" }
// do! で特にクソな部分な上に副作用まで発生させることを表明できる
do! printfn "kuso!"
for x in 1 .. 5 do
printfn "x : %d" x
let mutable y = 5
while y > 0 do
printfn "y : %d" y
y <- y - 1
return kuso1 + 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment