Проблема в том, что вы пытаетесь вызвать рекурсивную функцию с другим типом для рекурсивного шага. Рассмотрим определение:
argsFromList f [] = f
argsFromList f (x:xs) = argsFromList (f x) xs
Давайте попробуем сами определить тип. Мы сразу видим, что первый аргумент f
должен быть функцией как минимум одного аргумента, второй аргумент (x:xs)
является списком, а элементы списка должны быть того же типа, что и первый аргумент f
. В первом случае возвращается аргумент f
, поэтому окончательный тип возвращаемого значения должен совпадать с первым аргументом. Итак, начнем с этого:
argsFromList :: (a -> ?) -> [a] -> (a -> ?)
Чтобы найти неизвестный тип ?
, мы можем взглянуть на второй случай, который состоит из рекурсивного вызова. Аргумент xs
имеет тот же тип списка, а аргумент (f x)
имеет тип ?
. Поскольку он используется в качестве первого аргумента в рекурсивном вызове, который имеет тип (a -> ?)
, теперь мы можем заключить, что ?
- это тот же тип, что и (a -> ?)
, который, следовательно, тот же тип, что и (a -> (a -> ?))
, который поэтому является тот же тип, что и (a -> (a -> (a -> ?)))
, который ... упс.
Это, конечно, "бесконечный тип".
Если вы хотите сделать это с функциями, которые используют переменное число аргументов одного типа, вы, вероятно, захотите использовать функции, которые принимают список значений, а не отдельные аргументы. В противном случае вам придется либо написать каждую версию по отдельности, либо использовать некоторые тайные приемы, включающие расширенные возможности языка, ни один из которых не подходит в простом случае, подобном этому.