Te veel argumenten in algemene versie van vouw-functie voor BST

stemmen
0

Running vouw (+) 0 monster geeft me een fout over (+) wordt toegepast op te veel argumenten. Waarom?

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

Zie ook: vouw

De vraag is gesteld op 04/02/2011 om 01:23
bron van user
In andere talen...                            


2 antwoorden

stemmen
1

Je foldvraagt om een functie van het type a -> b -> b -> bals zijn eerste parameter, dat is een functie die drie argumenten neemt. (+)Anderzijds neemt twee argumenten.

Indien foldmoet worden gewijzigd of als u belt met een andere functie hangt af van wat je precies probeert te doen.

antwoordde op 04/02/2011 om 01:28
bron van user

stemmen
1

Uw probleem is dat je het toepassen van de functie om 3 argumenten. De eerste parameter in de handtekening soort zegt het allemaal.

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)

(+) Duurt slechts 2 argumenten, maar als je het passeren, het probeert om dit te evalueren:

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

Wilt u waarschijnlijk te vouwen met een binaire functie (a -> a -> a). Stel dat u wilt gebruiken (+). U wilt het resultaat te zijn als volgt:

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

Vanaf daar is het makkelijk om te generaliseren: vervang gewoon +met een infixedf

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)
antwoordde op 04/02/2011 om 04:13
bron van user

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