Как часть моего учебного процесса 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 к нему?
Спасибо.