{Record file_create file_open file_close file_write file_read_all die run pure bind1 lift1 lift2 sequence2 sequence3 compose read_file print_line } Where Let (read_file file_name) (bind1 (file_open file_name) Func file. (lift2 (file_read_all file) (file_close file) Func text _. text)) Where Let (print_line text) Func _. (STDIO.print_line text) Let (file_create name) Func _. (Prim file_create name) Let (file_open name) Func _. (Prim file_open name) Let (file_close file) Func _. (Prim file_close file) Let (file_write file string) Func _. (Prim file_write file string) Let (file_read_all file) Func _. (Prim file_read_all file) Let (die message) Func _. (Prim die message) Where Let (run m) Do (m {}) In {} Let (pure x) Func _. x Let (bind1 m1 f) Func _. Let m2 (f (m1 {})) In (m2 {}) Let (lift1 m1 f) Func _. Let x1 (m1 {}) In (f x1) Let (lift2 m1 m2 f) Func _. Let x1 (m1 {}) Let x2 (m2 {}) In (f x1 x2) Let (sequence2 m1 m2) Func _. Do (m1 {}) Do (m2 {}) In {} Let (sequence3 m1 m2 m3) Func _. Do (m1 {}) Do (m2 {}) Do (m3 {}) In {} Let (compose f g) Func x1. Func _. Let m1 (f x1) In Let x2 (m1 {}) In Let m2 (g x2) In (m2 {}) Where Let STDIO Package "stdio"