Ответ 1
pr f g = \xs y' -> case y' of 0 -> f xs
(y+1) -> g xs y ((pr f g) xs y)
или просто
pr f g xs 0 = f xs
pr f g xs (y+1) = g xs y ((pr f g) xs y)
(Помните, что f a b = ...
является в основном ярлыком для f a = \b -> ...
, который является ярлыком для f = \a -> \b -> ...
.)
Обратите внимание, что n + 1 шаблонов устарели и что тип, указанный вами для pr, не соответствует вашему (и моему) определению.
В зависимости от вашего типа функция принимает [Int] -> Int
(f), затем функцию, которая принимает еще один [Int] -> Int
(g), затем функцию, которая принимает [Int]
(xs), а затем возвращает Int. Однако вы вызываете g с тремя аргументами, а последняя возвращаемая функция принимает два аргумента, поэтому предположительно вы хотите что-то вроде ([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int
.