Haskell „Zastosuj”? [duplikować]

Możliwy duplikat:
Dlaczego taka definicja funkcji nie jest dozwolona w haskell?

Jestem nowicjuszem w świecie Haskella, migrującym z Lisp. Próbuję dostosować się do zasadniczo odmiennego światopoglądu Haskella, a jedną z wielu rzeczy, które uważam za nowe i ekscytujące, jest system typów. Będąc Lisperem, pomyślałem, że spróbuję zaimplementować w Haskell funkcję, która jest bardzo ważna w świecie Lisp:apply. Dla tych, którzy nie wiedzą, zastosuj przyjmuje funkcję i listę argumentów i wywołuje funkcję na tych argumentach. W schemacie(apply + '(1 2 3)) jest taki sam jak wywołanie(+ 1 2 3)i zwraca 6.

Mój kod Haskella wygląda mniej więcej tak:

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

Ale Haskell narzeka:

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

I myślę, że rozumiem dlaczego. Typ zgłoszenia musi być inny w zależności od długości listy, którą jest podany. Biorąc pod uwagę listę, powiedzmy, 3 elementów, typ zgłoszenia musi być:(a -> a -> a -> b) -> [a] -> b, ale biorąc pod uwagę listę 6 pozycji, typ zgłoszenia musi być:(a -> a -> a -> a -> a -> a -> b) -> [a] -> b.

Próbowałem tego przerażającego obejścia:

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]

To działa, ale prawie nie liczy się jakoapply funkcja, ponieważ nie mogę przejśćapply normalna funkcja, muszę użyć tej, która została napisana specjalnie, aby użyć mojej (niezręcznej) abstrakcji FnOrDat. Gdybym chciał napisać funkcję, która dodała cztery liczby, musiałbym napisać

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

Ew.

Więc - brakuje mi czegoś lub prosi o cel ogólnyapply zasadniczo jak proszenie o funkcję, która może manipulować krotką o dowolnej długości? Robiapply nawet ma sens w statycznie typowanym światopoglądzie Haskella?

questionAnswers(3)

yourAnswerToTheQuestion