Πάρα πολλά επιχειρήματα σε γενικευμένη έκδοση της πτυχής λειτουργίας για BST

ψήφοι
0

Τρέξιμο φορές (+) 0 δείγμα μου δίνει ένα σφάλμα περίπου (+) που εφαρμόζεται σε πάρα πολλά επιχειρήματα. Γιατί;

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

Δείτε επίσης: fold

Δημοσιεύθηκε 04/02/2011 στις 01:23
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Σας foldαπαιτεί μια λειτουργία του τύπου a -> b -> b -> bως πρώτη παράμετρο, δηλαδή μια λειτουργία που διαρκεί τρία επιχειρήματα. (+)Από την άλλη πλευρά διαρκεί μόνο δύο επιχειρήματα.

Αν foldθα πρέπει να αλλάξει ή αν χρειάζεστε να το ονομάσουμε με διαφορετική λειτουργία εξαρτάται από το τι ακριβώς προσπαθούμε να κάνουμε.

Απαντήθηκε 04/02/2011 στις 01:28
πηγή χρήστη

ψήφοι
1

Το πρόβλημά σας είναι εφαρμόζετε τη λειτουργία σε 3 επιχειρήματα. Η πρώτη παράμετρος στην υπογραφή του τύπου τα λέει όλα.

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)

(+) Διαρκεί μόνο 2 επιχειρήματα, αλλά όταν το περάσει μέσα, προσπαθεί να αξιολογήσει αυτό:

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

Πιθανόν να θέλετε να πάτε πάσο με ένα δυαδικό συνάρτηση (α -> a -> α). Ας υποθέσουμε ότι θέλετε να χρησιμοποιήσετε (+). Θέλετε το αποτέλεσμα να είναι κάπως έτσι:

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

Από εκεί είναι εύκολο να γενικεύσουμε: απλά αντικαταστήστε +με εμπεπηγμένου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)
Απαντήθηκε 04/02/2011 στις 04:13
πηγή χρήστη

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