Como reutilizar uma variável de tipo em uma declaração de tipo interna

omo parte do meu processo de aprendizado Haskell, eu gosto de digitar explicitamente as declarações de tipo para funções. Gostaria de poder fazê-lo para funções definidas em uma cláusula where, mas não sei como especificar, que uma variável de tipo em uma cláusula where deve denotar o mesmo tipo de alguma variável de tipo na declaração de tipo externa. Por exemplo, o seguinte código:

foo :: (a -> a) -> a -> a
foo f arg = bar arg
  where
    bar :: a -> a
    bar a = f a

gera este erro:

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

Como posso expressar que o primeiro argumento para bar deve ser do mesmo tipo que o segundo argumento para foo, para que eu possa aplicar f a el

Obrigado

questionAnswers(4)

yourAnswerToTheQuestion