Haskell: Especificando Restrições de Comprimento Igual a Listas no Sistema de Tipos

Em Haskell, muitas vezes tenho uma função comof, que aceita uma lista e retorna uma lista de igual comprimento:

f :: [a] -> [a]  -- length f(xs) == length xs

Da mesma forma, eu posso ter uma função comog, que aceita duas listas que devem ter o mesmo comprimento:

g :: [a] -> [a] -> ...

E sef eg são digitados como acima, podem ocorrer erros em tempo de execução se suas restrições relacionadas ao comprimento não forem atendidas. Eu gostaria, portanto, de codificar essas restrições no sistema de tipos. Como eu posso fazer isso?

Observe que estou procurando uma estrutura prática que possa ser usada em situações cotidianas, adicionando o mínimo possível de sobrecarga intuitiva ao código. Estou particularmente interessado em saber como você lidaria comf eg você mesmo; isto é, você tentaria adicionar as restrições relacionadas ao comprimento aos seus tipos, conforme solicitado aqui, ou você as deixaria com os tipos conforme indicado acima para simplificar o código?

questionAnswers(2)

yourAnswerToTheQuestion