Cómo reutilizar una variable de tipo en una declaración de tipo interna
Como parte de mi proceso de aprendizaje de Haskell, me gusta escribir explícitamente las declaraciones de tipo para las funciones. Me gustaría poder hacerlo para funciones definidas en una cláusula where, pero no sé cómo especificar que una variable de tipo en una cláusula where denote el mismo tipo que alguna variable de tipo en la declaración de tipo externa. Por ejemplo, el siguiente código:
foo :: (a -> a) -> a -> a
foo f arg = bar arg
where
bar :: a -> a
bar a = f a
produce este error:
src\Test.hs:7:14:
Couldn't match expected type `a' against inferred type `a1'
`a' is a rigid type variable bound by
the type signature for `foo' at src\Test.hs:3:8
`a1' is a rigid type variable bound by
the type signature for `bar' at src\Test.hs:6:11
In the first argument of `f', namely `a'
In the expression: f a
In the definition of `bar': bar a = f a
¿Cómo puedo expresar que el primer argumento para bar debe ser del mismo tipo que el segundo argumento para foo, de modo que pueda aplicarle f?
Gracias