Haskell: especificación de restricciones de igual longitud de listas en el sistema de tipos

En Haskell, a menudo tengo una función comof, que acepta una lista y devuelve una lista de igual longitud:

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

Del mismo modo, podría tener una función comog, que acepta dos listas que deberían tener la misma longitud:

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

Sif yg se escriben como anteriormente, luego pueden producirse errores de tiempo de ejecución si no se cumplen sus restricciones relacionadas con la longitud. Por lo tanto, me gustaría codificar estas restricciones en el sistema de tipos. ¿Cómo podría hacer esto?

Tenga en cuenta que estoy buscando un marco práctico que pueda usarse en situaciones cotidianas, agregando la menor sobrecarga intuitiva posible al código. Estoy particularmente interesado en saber cómo trataríasf yg usted mismo; es decir, ¿intentaría agregar las restricciones relacionadas con la longitud a sus tipos, como se le solicita aquí, o los dejaría con los tipos como se indica anteriormente para simplificar el código?

Respuestas a la pregunta(2)

Su respuesta a la pregunta