http://www.haskell.org/ghc/docs/latest/html/users_guide/other-type-extensions.html#scoped-type-variables

асть моего процесса обучения на Haskell, мне нравится явно печатать объявления типов для функций. Я хотел бы иметь возможность сделать это для функций, определенных в предложении where, но я не знаю, как указать, что переменная типа в предложении where должна обозначать тот же тип, что и некоторая переменная типа во внешнем объявлении типа. Например, следующий код:

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

выдает эту ошибку:

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

Как я могу выразить, что первый аргумент bar должен быть того же типа, что и второй аргумент foo, чтобы я мог применить f к нему?

Благодарю.

Ответы на вопрос(4)

Ваш ответ на вопрос