module RealWorld = begin
type World = private | World
and 'a Pure = private | Pure of 'a
and 'a IO = World -> 'a Pure * World
val bind : a1:'a IO -> a2:'b IO -> world0:World -> 'b Pure * World
val lift :
a1:'a IO -> a2:('a Pure -> 'b IO) -> world0:World -> 'b Pure * World
val ( >> ) : ('a IO -> 'b IO -> 'b IO)
val ( >>= ) : ('a IO -> ('a Pure -> 'b IO) -> 'b IO)
val unit : unit Pure = Pure ()
val effect : f:('a -> 'b) -> 'a Pure -> 'b IO
val eval : main:unit IO -> unit Pure * World
module Don = begin
type DonBuilder =
class
new : unit -> DonBuilder
member Bind' : a1:'c IO * a2:'d IO -> 'd IO
member LiftM : a1:'a IO * a2:('a Pure -> 'b IO) -> 'b IO
member Yield : unit -> unit IO
end
val don : DonBuilder
end
end
moduleUtil=openRealWorldmoduleRandom=letprivater=newSystem.Random()letnext()=r.Next()moduleRead=letreadInt()=System.Console.Read()letreadKey()=System.Console.ReadKey()letreadLine()=System.Console.ReadLine()let(!):'a->'aIO=funa->effect(fun_->a)unitletgetRand:intIO=effectRandom.nextunitletputInt:intPure->unitIO=effect<|printf"%i"letreadLn:stringIO=effectRead.readLineunitletputStr:stringPure->unitIO=effect<|printf"%s"letputStrLn:stringPure->unitIO=effect<|printfn"%s"letsample1:unitIO=!"What is your name?">>=putStrLn>>readLn>>=funa->!"How old are you?">>=putStrLn>>readLn>>=funb->putStra>>!",">>=putStr>>putStrLnbletsample2:unitIO=don{bind!"What is your name?"liftputStrLnbindreadLnlift(funa->don{bind!"How old are you?"liftputStrLnbindreadLnlift(funb->don{bind(putStra)bind!","liftputStrbind(putStrLnb)})})}
Utils Code output:
module Util = begin
module Random = begin
val private r : System.Random
val next : unit -> int
end
module Read = begin
val readInt : unit -> int
val readKey : unit -> System.ConsoleKeyInfo
val readLine : unit -> string
end
val ( ! ) : a:'a -> 'a RealWorld.IO
val getRand : int RealWorld.IO
val putInt : (int RealWorld.Pure -> unit RealWorld.IO)
val readLn : string RealWorld.IO
val putStr : (string RealWorld.Pure -> unit RealWorld.IO)
val putStrLn : (string RealWorld.Pure -> unit RealWorld.IO)
val sample1 : unit RealWorld.IO
val sample2 : unit RealWorld.IO
end