module Has (r,p,s) where
import Prelude ((==),Bool(..),otherwise,(||),Eq)
import qualified Data.List as L
filter :: (a -> Bool) -> [a] -> [a]
filter _pred [] = []
filter pred (x:xs)
| pred x = x : filter pred xs
| otherwise = filter pred xs
problem1: यह filter
GHC
के पुस्तकालय से कॉपी किया जाता है, लेकिन क्यों यह में स्मृति की बढ़ती संख्या की खपत के साथ विपरीत सीधे आयातित filter
, जो स्मृति की निरंतर संख्या का उपभोग करता है।क्यों GHC में सीधे आयात कार्यों कार्यों मैं GHC पुस्तकालय से नकल स्रोत कोड के साथ लिखने के साथ इतना कुछ अलग
elem :: (Eq a) => a -> [a] -> Bool
elem _ [] = False
elem x (y:ys) = x==y || elem x ys
problem2: यह filter
GHC
के पुस्तकालय से कॉपी किया जाता है, लेकिन क्यों यह स्मृति की तरह सीधे elem
इस्तेमाल किया की बढ़ती संख्या, जो भी स्मृति की बढ़ती संख्या के विपरीत के साथ की खपत की खपत सीधे आयातित filter
।
r = L.filter (==1000000000000) [0..]
p = filter (==1000000000000) [0..]
s = 1000000000000 `elem` [0..]
GHC संस्करण: 7.4.2 ओएस: उबंटू 12.10 -O2 साथ संकलित
अनुकूलन करने के लिए ऊपर filter
के रूप में और elem
की परिभाषाओं दोनों p = filter (==1000000000000) [0..]
दिखाते हैं और s = 1000000000000 `elem` [0..]
के [0..]
कचरा धीरे-धीरे एकत्र किया जाना चाहिए। लेकिन p
और s
दोनों मेमोरी की बढ़ती संख्या का उपभोग करते हैं। और r
जिसे सीधे आयातित filter
के साथ परिभाषित किया गया है, स्मृति की निरंतर संख्या का उपभोग करता है।
मेरा सवाल यह है कि जीएचसी में सीधे आयातित कार्यों को जीएचसी पुस्तकालयों से कॉपी किए गए स्रोत कोड के साथ लिखने वाले कार्यों के साथ इतना अलग है। मुझे आश्चर्य हुआ कि जीएचसी के साथ कुछ गड़बड़ है?
मेरे पास एक और सवाल है: उपर्युक्त कोड एक प्रोजेक्ट से निकला हुआ है, और परियोजना को "स्मृति में बढ़ती कचरा होने की समस्या" का सामना करना पड़ता है। तो मैं जानना चाहता हूं कि यह पता लगाने का कोई तरीका है कि जीएचसी में कौन सी चरम इतनी मेमोरी लेती है।
आपके पढ़ने के लिए धन्यवाद।
जीएचसी संस्करण, ओएस? मैं इस तरह 'elem' को लागू करने वाली स्मृति वृद्धि को पुन: पेश नहीं कर सकता। – Koterpillar
जीएचसी पुस्तकालय से कॉपी किया गया? वास्तव में इन परिभाषाओं के मुकाबले वहां बहुत कुछ है, उदाहरण के लिए ['{- # नियम" फ़िल्टर "[~ 1] फॉरल पी एक्सएस। फिल्टर पी xs = build (\ cn -> फ़ोल्डर (फ़िल्टरएफबी सीपी) एन एक्सएस) # -} '] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC- List.html # फ़िल्टर), जिसका अर्थ है कि आपके द्वारा सामान्य रूप से उद्धृत परिभाषा का उपयोग नहीं किया जाएगा। - उसने कहा, मैं भी आपके स्मृति उपभोग मुद्दों को पुन: उत्पन्न नहीं कर सकता। आप किस अनुकूलन झंडे का उपयोग करते हैं? – leftaroundabout
मुझे लगता है कि वह मानक प्रस्तावना में परिभाषा का मतलब है। रास्ते में या तो समस्या को पुन: उत्पन्न नहीं कर सकता। – mrueg