Denotational Design is a strong approach to software design applicable to ML languages like Haskell, Elm, F# and OCaml.
I was first introduced to Denotaional Design when I watched a talk by Conal Elliot:
https://www.youtube.com/watch?v=bmKYiUOEo2A (slides)
More references: