Are there any known principles, best-practices and design patterns that one can follow while writing code in a functional programming language?
There are folds, unfolds, maps, etc.
I consider using them best practice, as it is pretty easy to reason about their behavior, and they often communicate the purpose of a function (for an example, just take a look at the famous Evolution of a Haskell Programmer and contrast freshman with senior, and with professor).