Prea multe argumente în versiunea generalizată a funcției ori mai mare pentru BST

voturi
0

Rularea ori (+) 0 probă dă - mi o eroare (+) fiind aplicat la prea multe argumente. De ce?

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

A se vedea , de asemenea: ori

Întrebat 04/02/2011 la 01:23
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
1

Dvs. foldnecesită o funcție de tip a -> b -> b -> bca prim parametru, care este o funcție care are trei argumente. (+)pe de altă parte , are doar două argumente.

În cazul în care foldar trebui să fie modificat sau dacă aveți nevoie de a apela - l cu o altă funcție depinde de exact ceea ce încercați să faceți.

Publicat 04/02/2011 la 01:28
sursa de către utilizator

voturi
1

Problema ta este că aplicați funcția la 3 argumente. Primul parametru de tip semnatura spune totul.

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)

(+) Durează doar 2 argumente, dar atunci când îl treci în, încearcă să evalueze acest lucru:

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

Probabil că doriți să se plieze cu o funcție binară (a -> a -> a). Să presupunem că doriți să utilizați (+). Vrei ca rezultatul să fie așa:

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

De acolo este ușor de a generaliza: doar înlocuiți +cu un 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)
Publicat 04/02/2011 la 04:13
sursa de către utilizator

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