Zu viele Argumente in verallgemeinerte Version von Falzfunktion für BST

stimmen
0

Lauffalte (+) 0 Probe gibt mir eine Fehlermeldung über (+) viele Argumente zu angewendet wird. Warum?

data(Ord a, Show a, Read  a) => BST a = Void | Node {
    val :: a,
    left, right :: BST a
} deriving (Eq,  Ord,  Read,  Show)

sample = Node 5 (Node 3 Void Void) (Node 10 Void Void)

fold :: (Read a, Show a, Ord a) => (a -> b -> b ->  b) -> b -> BST a -> b
fold _ z Void         = z
fold f z (Node x l r) = f x (fold f z l) (fold f z r)
Occurs check: cannot construct the infinite type: a = a -> a
Probable cause: `+' is applied to too many arguments
In the first argument of `fold'', namely `(+)'
In the expression: fold' (+) 0 sample

Siehe auch: falten

Veröffentlicht am 04/02/2011 um 01:23
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Ihr foldbenötigt eine Funktion vom Typ a -> b -> b -> bals ersten Parameter, dh eine Funktion , die drei Argumente annimmt. (+)auf der anderen Seite dauert nur zwei Argumente.

Wenn foldsollte oder geändert werden , wenn Sie es brauchen rufen Sie mit einer anderen Funktion hängt davon ab , was genau wollen Sie tun.

Beantwortet am 04/02/2011 um 01:28
quelle vom benutzer

stimmen
1

Ihr Problem ist, dass Sie die Funktion 3 Argumente anwenden. Der erste Parameter in der Art Signatur sagt alles.

fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)

(+) Dauert nur 2 Argumente, aber wenn man es in geben, versucht er, diese zu bewerten:

(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P

Sie wollen wahrscheinlich mit einer binären Funktion (a -> a -> a) falten. Angenommen, Sie verwenden möchten (+). Sie möchten das Ergebnis so sein:

fold f z (Node x l r) = x + (fold f z l) + (fold f z r)

Von dort aus ist es leicht zu verallgemeinern: ersetzen Sie einfach +mit einem Infixf

fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)
Beantwortet am 04/02/2011 um 04:13
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more