Effects in the type
The signature tells you - and the agent - everything a function can do. This one reads the filesystem, so its type carries ! FS; a function with no effect row can't touch the outside world at all.
fn describe(path: String) -> String ! FS {
match Fs.read_file(path) {
Ok(_) -> "read ${path}"
Err(_) -> "missing ${path}"
}
}