Погромировать - не наука. Это умение выражать алгоритмы. Вот то, что пытаешься написать - сам матаппарат задачи, вот это может быть наукой.
Т.е. условно, функция типа:
getOrderContact :: Order -> Maybe Contact
Это утверждение о том, что имея терм типа Order ты можешь из него получить терм типа Maybe Contact.
Доказательством этого утверждения будет собственно реализованная и тайпчекнутое тело фукнции.