Haskell "Aplicar"? [duplicado]

Duplicata Possível:
Por que essa definição de função não é permitida no haskell?

Sou um recém-chegado ao mundo de Haskell, migrando de Lisp. Estou tentando me ajustar à visão de mundo fundamentalmente diferente de Haskell, e uma das muitas coisas que acho novas e empolgantes é o sistema de tipos. Sendo um Lisper, pensei em tentar implementar em Haskell uma função que é muito importante no mundo Lisp:apply. Para quem não sabe, apply usa uma função e uma lista de argumentos e invoca a função nesses argumentos. No esquema,(apply + '(1 2 3)) é o mesmo que invocar(+ 1 2 3)e retorna 6.

Meu código Haskell é parecido com isto:

apply x [] = x
apply f (x:xs) = apply (f x) xs

Mas Haskell reclama:

ERROR line 2 - Type error in function binding
*** Term           : apply
*** Type           : (b -> a) -> [b] -> a
*** Does not match : a -> [b] -> a
*** Because        : unification would give infinite type

E eu acho que entendo o porquê. O tipo de Apply precisa ser diferente dependendo do tamanho da lista que é dada. Dada uma lista de, digamos, 3 itens, o tipo de aplicação precisaria ser:(a -> a -> a -> b) -> [a] -> b, mas com uma lista de 6 itens, o tipo de aplicação precisaria ser:(a -> a -> a -> a -> a -> a -> b) -> [a] -> b.

Eu tentei este trabalho horrendo:

data FnOrDat a b = Dat b | Fn (a -> FnOrDat a b)

apply :: (FnOrDat a b) -> [a] -> (FnOrDat a b)
apply x [] = x
apply (Fn f) (x:xs) = apply (f x) xs
apply (Dat _) _ = error "Cannot apply something which is not a function!"

add a = Fn (\b -> Dat (a + b))

main = putStrLn $ show $ x where Dat x = apply (Fn add) [5,1]

Isso funciona, mas dificilmente conta comoapply função, porque eu não posso passarapply uma função normal, eu tenho que usar um que tenha sido escrito especificamente para usar minha abstração FnOrDat (desajeitada). Se eu quisesse escrever uma função que adicionasse quatro números, eu precisaria escrever

add4 a = Fn (\b -> Fn (\c -> Fn (\d -> Dat (a + b + c + d))))

Ai credo.

Então - estou faltando alguma coisa, ou está pedindo um propósito geral?apply basicamente como pedir uma função que pode manipular uma tupla de comprimento arbitrário? Fazapply Faz sentido na visão de mundo estaticamente tipificada de Haskell?

questionAnswers(3)

yourAnswerToTheQuestion