Haskell "Bewerben"? [Duplikat]

Mögliche Duplikate:
Warum ist eine solche Funktionsdefinition in haskell nicht erlaubt?

Ich bin ein Neuling in der Welt von Haskell und wandere von Lisp ab. Ich versuche, mich an Haskells grundlegend anderes Weltbild anzupassen, und eines der vielen Dinge, die ich neu und aufregend finde, ist das Typensystem. Als Lisper dachte ich, ich würde versuchen, in Haskell eine Funktion zu implementieren, die in der Lisp-Welt sehr wichtig ist:apply. Für diejenigen, die es nicht wissen, übernimmt apply eine Funktion und eine Liste von Argumenten und ruft die Funktion für diese Argumente auf. Im Schema(apply + '(1 2 3)) ist dasselbe wie aufrufen(+ 1 2 3)und gibt 6 zurück.

Mein Haskell-Code sieht ungefähr so ​​aus:

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

Aber Haskell beschwert sich:

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

Und ich glaube, ich verstehe warum. Der Typ von Apply muss je nach Länge der Liste unterschiedlich sein. Bei einer Liste von beispielsweise 3 Elementen müsste der Typ der Anwendung wie folgt lauten:(a -> a -> a -> b) -> [a] -> bBei einer Liste von 6 Elementen müsste der Typ von apply jedoch lauten:(a -> a -> a -> a -> a -> a -> b) -> [a] -> b.

Ich habe diese schreckliche Abhilfe versucht:

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]

Das funktioniert, aber es zählt kaum alsapply Funktion, weil ich nicht passieren kannapply Als normale Funktion muss ich eine verwenden, die speziell für die Verwendung meiner (umständlichen) FnOrDat-Abstraktion geschrieben wurde. Wenn ich eine Funktion schreiben wollte, die vier Zahlen addiert, müsste ich schreiben

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

Ew.

Also - vermisse ich etwas oder frage nach einem allgemeinen Zweckapply im Grunde wie nach einer Funktion zu fragen, die ein Tupel beliebiger Länge manipulieren kann? Tutapply sogar in der statisch typisierten Weltanschauung von Haskell Sinn machen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage