Příliš mnoho argumentů v generalizované verzi násobné funkce pro BST

hlasů
0

Běžící násobné (+) 0 vzorek dává mi chybu o (+), který je aplikován na příliš mnoho argumentů. Proč?

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

Viz také: fold

Položena 04/02/2011 v 01:23
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Váš foldvyžaduje funkci typu a -> b -> b -> bjako první parametr, který je funkce, která trvá tři argumenty. (+)Na druhé straně trvá jen dva argumenty.

Pokud foldby měl být změněn, nebo pokud potřebujete volat ji s jinou funkcí je závislá na tom, co přesně se snažíte dělat.

Odpovězeno 04/02/2011 v 01:28
zdroj uživatelem

hlasů
1

Váš problém je žádáte funkci 3 argumenty. První parametr v podpisu typu mluví za vše.

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)

(+) Trvá jen 2 argumenty, ale když ji předat, se snaží zhodnotit toto:

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

Pravděpodobně budete chtít složit binární funkce (a -> a -> a). Předpokládejme, že chcete používat (+). Chcete výsledek bude takhle:

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

Odtud je to snadné zobecnit: stačí vyměnit +s 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)
Odpovězeno 04/02/2011 v 04:13
zdroj uživatelem

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