Preciso de ajuda para entender o resto e espalhar o operador

Este é o código:

const Pipe = (...fns) => fns.reduce((f,g) => (...args) => g(f(...args)));

Então, por (... fns) os argumentos fns se tornam uma matriz, certo? nesta parte:

 (f,g) => (...args)

de onde vieram os args? existe um parâmetro args padrão? e não consigo ler esta parte:

(...args) => g(f(...args))

Eu simplesmente não consigo envolver minha cabeça com esse aninhamento e o que reduzir aqui é tão confuso.

questionAnswers(3)

yourAnswerToTheQuestion