Troppi argomenti nella versione generalizzata della funzione di piegatura per BST

voti
0

Esecuzione di piega (+) 0 campione mi dà un errore circa (+) applicata al troppi argomenti. Perché?

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

Vedi anche: piegare

È pubblicato 04/02/2011 alle 01:23
fonte dall'utente
In altre lingue...                            


2 risposte

voti
1

Vostro foldrichiede una funzione di tipo a -> b -> b -> bcome primo parametro, che è una funzione che richiede tre argomenti. (+)dall'altro richiede solo due argomenti.

Se folddovrebbe essere cambiato o se avete bisogno chiamare con una funzione diversa dipende da che cosa esattamente si sta cercando di fare.

Risposto il 04/02/2011 a 01:28
fonte dall'utente

voti
1

Il tuo problema è che si sta applicando la funzione a 3 argomenti. Il primo parametro nella firma tipo dice tutto.

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)

(+) Richiede solo 2 argomenti, ma quando si passa a, cerca di valutare questa:

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

Probabilmente si desidera piegare con una funzione binaria (a -> A -> a). Si supponga di voler utilizzare (+). Si desidera che il risultato sia simile a questo:

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

Da lì è facile generalizzare: basta sostituire +con un'infissaf

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)
Risposto il 04/02/2011 a 04:13
fonte dall'utente

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