Trop d'arguments dans la version généralisée de la fonction BST fois

voix
0

Exécution fois (+) 0 échantillon me donne une erreur au sujet de (+) étant appliqué à trop d'arguments. Pourquoi?

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

Voir aussi: replier

Créé 04/02/2011 à 01:23
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Votre folddemande une fonction de type a -> b -> b -> bcomme premier paramètre, qui est une fonction qui prend trois arguments. (+)d'autre part ne prend deux arguments.

Si folddoit être changé ou si vous avez besoin d' appeler une autre fonction dépend de ce que vous essayez de faire exactement.

Créé 04/02/2011 à 01:28
source utilisateur

voix
1

Votre problème est que vous appliquez la fonction à 3 arguments. Le premier paramètre dans la signature de type dit tout.

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)

(+) Ne prend que 2 arguments, mais quand vous passez dans, il tente d'évaluer ceci:

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

Vous voulez probablement plier avec une fonction binaire (a -> a -> a). Supposons que vous souhaitez utiliser (+). Vous voulez que le résultat soit comme ceci:

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

De là , il est facile de généraliser: il suffit de remplacer +par un infixéf

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)
Créé 04/02/2011 à 04:13
source utilisateur

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