Túl sok érv általánosított változatát szeres funkció BST

szavazat
0

Futó szeres (+) 0 mintát ad nekem egy hiba körülbelül (+) alkalmaznak a túl sok érv. Miért?

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

Lásd még: szeres

A kérdést 04/02/2011 01:23
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
1

Ön foldigényli függvényében típusú a -> b -> b -> b, mint az első paraméter, amely egy olyan funkció, amely három paramétert. (+)másrészt csak két argumentuma.

Ha foldmeg kell változtatni, vagy ha szükség van nevezni egy másik funkciója attól függ, hogy pontosan mit akar csinálni.

Válaszolt 04/02/2011 01:28
a forrás felhasználó

szavazat
1

A probléma az, pályáznak a funkció 3 érveket. Az első paraméter a típus aláírás mindent elmond.

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)

(+) Mindössze 2 érveket, de ha azt át szándékozik, akkor megpróbálja értékelni ezt:

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

Talán szeretnénk dobni egy bináris funkció (a -> a -> a). Tegyük fel, hogy a használni kívánt (+). Azt szeretné, hogy az eredmény, mint ez:

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

Innen már csak könnyen általánosítható: csak cserélni +egy 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)
Válaszolt 04/02/2011 04:13
a forrás felhasználó

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