Demasiados argumentos en la versión generalizada de la función de plegado de BST

votos
0

Correr veces (+) 0 muestra me da un error acerca de (+) que se aplica a demasiados argumentos. ¿Por qué?

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

Ver también: doblar

Publicado el 04/02/2011 a las 01:23
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Su foldrequiere una función del tipo a -> b -> b -> bcomo primer parámetro, que es una función que toma tres argumentos. (+)por el contrario sólo toma dos argumentos.

Si foldse debe cambiar o si necesita llamar a una función diferente depende de qué es exactamente lo que está intentando hacer.

Respondida el 04/02/2011 a las 01:28
fuente por usuario

votos
1

Su problema es que está solicitando la función de 3 argumentos. El primer parámetro de la firma de tipo dice todo.

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)

(+) Sólo tiene 2 argumentos, pero cuando se pasa en ella, se trata de evaluar lo siguiente:

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

Es posible que desee plegar con una función binaria (a -> a -> a). Suponga que desea utilizar (+). Desea que el resultado sea así:

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

Desde allí es fácil generalizar: basta con sustituir +con un infijof

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)
Respondida el 04/02/2011 a las 04:13
fuente por usuario

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