Ο προσδιορισμός της έκτασης των τεμπέλης αξιολόγησης

ψήφοι
1

Δεδομένος

data BTree a = End
             | Node a (BTree a) (BTree a)
   deriving(Show,Eq,Ord)

data Msg = Msg { from :: String
               , to :: String
               , when :: Int
               , message :: String }

instance Ord Msg where
    compare a b = (when a) `compare` (when b)

instance Eq Msg where
    (==) a b = (when a) == (when b)

Λειτουργία μου να μετρήσει κόμβους (που φαίνεται μακριά, αλλά αυτό είναι πέρα ​​από το θέμα) είναι

count :: (Ord a) => (BTree a) -> Int
count = sum . count'
 where
  count' :: (Ord a) => (BTree a) -> [Int] 
  count' End = []
  count' (Node _ l r) =
    [1] ++ (count' l) ++ (count' r)

Μήπως countδεν αξιολογεί το περιεχόμενο της Msgλόγω της αξίας του που απορρίπτονται από _; Ίσως μια καλύτερη ερώτηση είναι, πώς μπορώ να ξέρω πού τεμπέλης ξεκινά αξιολόγησης και τελειώνει για αυτό το είδος του πράγματος;

Εάν η τρίτη γραμμή count'ήταν:

count' (Node (Msg x _ _ _) l r) =

Μπορώ να υποθέσουμε ότι οι άλλοι τρεις τομείς Msgήταν προσβάσιμες / αξιολογούνται, ή μήπως τεμπέλης αξιολόγηση πάνε τόσο μακριά;

Δημοσιεύθηκε 10/10/2011 στις 17:38
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Νο Οι πεδία μίας δομής δεδομένων αξιολογούνται νωχελικά από προεπιλογή. Από τη στιγμή που δεν χρησιμοποιείτε τα άλλα πεδία με οποιονδήποτε τρόπο, δεν θα πρέπει να αξιολογηθεί από αυτόν τον κώδικα. Αν θέλετε να το κάνετε, έτσι ώστε να αξιολογηθεί ένας κόμβος δυνάμεις όλους τους τομείς που πρέπει να αξιολογηθούν, μπορείτε να προσθέσετε σχόλια αυστηρότητα στους τομείς:

data BTree a = End
             | Node !a (BTree a) (BTree a)
   deriving(Show,Eq,Ord)

data Msg = Msg { from :: !String
               , to :: !String
               , when :: !Int
               , message :: !String }

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

count' (Node x l r) = x `seq` ([1] ++ count' l ++ count' r)

ή ένα μοτίβο κτύπημα (απαιτεί την BangPatternsεπέκταση)

count' (Node !x l r) = [1] ++ count' l ++ count' r
Απαντήθηκε 10/10/2011 στις 17:56
πηγή χρήστη

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