Er, don't Haskell's head and (!!) functions default to throwing an exception?
$ ghci
Prelude> let a = [3, 4, 5]
Prelude> a !! 0
3
Prelude> a !! 3
*** Exception: Prelude.(!!): index too large
Prelude> head []
*** Exception: Prelude.head: empty list
I don't think Haskell is really different from Rust in this respect. Both have a wrapper type for optional values with good syntax, but in both, there's still some syntax so common operations sometimes choose to skip it.
In fact, Hoogle doesn't seem to find me a function like Rust's .get() in the standard library, just a handful of third-party packages: https://hoogle.haskell.org/?hoogle=%5Ba%5D+-%3E+Int+-%3E+May...