It seems that in Haskell you have to learn several languages rather than just one, you have to see the program, the program written at the type level, the program written using tacit style, the program using the different type classes... Haskell the terminology is completely alien from all other languages and often deliberately misleading like return for wrapping into a monad instead of wrap, join instead of flatten, bind for >>=. Lets not add that names like semigroup, magma, monad, monoid, cartesian closed categories, kleisi arrow, profunctor, mean very little until you learn them. I have an idea of naming Haskell things by their "type/code" like afa for return/liftM0, aifafi for map/liftA, aiufafifu for zipWith/liftA2, =
Not sure I get the statement that there is no separation between interface and implementation in mathematics. On the contrary, most definitions in math are basically abstract interfaces + specifications (laws).