9.3. Effects (Idris)
Some types:
Effect: Any :=
all (T: Any): Any -> (T -> Any) -> Any
type State: Effect :=
get {A: Any}: State A A (\ _ := A)
put {A B: Any}: B -> State Unit A (\ _ := B)
abstract type Handler (E: Effect) (M: Any -> Any) :=
handle {T R A: Any} {P: T -> Any}:
R -> E T R P -> (all x: P x -> M A) -> M A
type Mode := [read, write]
type FileIO: Effect :=
open (name: String) (m: Mode):
FileIO Bool Unit (case \ true := OpenFile m
\ false := ())
close {m} : FileIO Unit (OpenFile m) (\ _ := Unit)
readLine: FileIO String (OpenFile read) (\ _ := OpenFile read)
writeLine:
String -> FileIO Unit (OpenFile write) (\ _ := OpenFile write)
eof: FileIO Bool (OpenFile read) (\ _ := OpenFile read)