In Java, there are "SAM-interfaces" which are used as "types" for lambda expressions. In Haskell, there are dedicated types for functions. In Rust, there are no types for functions, but instead there are traits for functions. What are the differences between these approaches? For a new language, which one should be chosen?