आलसी मूल्यांकन की सीमा निर्धारित करने

वोट
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

नहीं। एक डेटा संरचना के क्षेत्र डिफ़ॉल्ट रूप से lazily मूल्यांकन किया जाता है। आप किसी भी तरह से अन्य क्षेत्रों का उपयोग नहीं कर रहे हैं, वे इस कोड द्वारा मूल्यांकन नहीं किया जाएगा। आप इसे बनाने के लिए इतना है कि एक नोड बलों अपने सभी क्षेत्रों का मूल्यांकन किया जाना मूल्यांकन, आप क्षेत्रों के लिए कठोरता एनोटेशन जोड़ने कर सकते हैं:

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