Вы можете заменить - но не забудьте заключить в скобки! Это должно быть:
build :: ( [a] -> [(b,[a])] ) -> ( b -> c ) -> ( [a] -> [(c,[a])] )
Поскольку стрелка функции является ассоциативной справа, вы можете выбросить правый набор скобок, но, что важно, вы не можете сбросить новые слева:
build :: ( [a] -> [(b,[a])] ) -> ( b -> c ) -> [a] -> [(c,[a])]
Итак, теперь, когда у вас есть строка build p f inp
, вы можете увидеть, что:
p :: ( [a] -> [(b,[a])] )
f :: ( b -> c )
inp :: [a]
Итак, мы можем видеть, что:
p inp :: [(b, [a])]
И, таким образом:
x :: b
rem :: [a]
И
f x :: c
(f x, rem) :: (c, [a])
И, следовательно, понимание всего списка имеет тип [(c, [a])]
- который точно соответствует тому, что должен возвращать build
. Надеюсь, это поможет!