Ответ Скотта верный, результат foldr
является функцией, поэтому кажется, что foldr
принимает 4 аргумента. Функции foldr
принимают 3 аргумента (функция, база, список):
*Main> :type foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
Я просто приведу пример, который является менее сложным:
inc :: Int -> (Int -> Int)
inc v = \x -> x + v
test = inc 2 40 -- output of test is 42
В приведенном выше коде inc
принимает один аргумент v
и возвращает функцию, которая увеличивает свой аргумент на v
.
Как мы видим ниже, тип возвращаемого значения inc 2
является функцией, поэтому ее аргумент может быть просто добавлен в конце:
*Main> :type inc
inc :: Int -> Int -> Int
*Main> :type inc 2
inc 2 :: Int -> Int
*Main> :type inc 2 40
inc 2 40 :: Int
Скобки можно использовать, чтобы подчеркнуть, что возвращаемое значение является функцией, но функционально оно идентично приведенному выше коду:
*Main> (inc 2) 40
42
PS: я автор оригинального комментария:)