These operations are not hard, what’s hard is doing them in a lazy context like they describe: they’re trying to evaluate data without, you know, evaluating it. Good luck.
Obviously, static analysis is possible, but the type system needs to be designed with type-checking functions in mind.
The paper also describes function contracts, which I think simply ensure that the return types and argument types conform to a specification. This isn’t lazy, per se, but in a dynamic language you can’t check those things until you call the function. But isn’t that an obvious point?