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

Respuestas a la pregunta(4)

Su respuesta a la pregunta