मैं सिस्टम विश्लेषण को फिर से सीखने की कोशिश कर रहा हूं। मुझे बहुत ऑब्जेक्ट उन्मुख सोच मिली है जिसके लिए मैं अभी भी हास्केल में समकक्ष नहीं ढूंढ पा रहा हूं।हास्केल में ऑब्जेक्ट ग्राफ़ कैसे प्रबंधित करते हैं?
एक काल्पनिक प्रणाली में एम्बुलेंस स्टेशन, एम्बुलेंस और क्रू शामिल हैं। (यह पहले से ऑब्जेक्ट-वाई प्राप्त कर रहा है।) इस सभी राज्य को एक बड़े सिस्टमस्टेट प्रकार में लपेटा जा सकता है। सिस्टमस्टेट [स्टेशन] [एम्बुलेंस] [क्रू]। मैं फिर उन कार्यों को बना सकता हूं जो सिस्टमस्टेट लेते हैं, और एक नया सिस्टमस्टेट लौटाते हैं।
module AmbSys
(version
, SystemState
, Station
, Ambulance
, Crew
) where
version = "0.0.1"
data SystemState = SystemState [Station] [Ambulance] [Crew] deriving (Show)
data Station = Station { stName :: String
, stAmbulances :: [Ambulance]
} deriving (Show)
data Ambulance = Ambulance { amCallSign :: String
, amStation :: Station
, amCrew :: [Crew]
} deriving (Show)
data Crew = Crew { crName :: String
, crAmbulance :: Ambulance
, crOnDuty :: Bool
} deriving (Show)
यहाँ एक GHCi सत्र मैं कुछ डेटा को बना है।
*AmbSys> :load AmbSys
[1 of 1] Compiling AmbSys (AmbSys.hs, interpreted)
Ok, modules loaded: AmbSys.
*AmbSys> let s = Station "London" []
*AmbSys> let a = Ambulance "ABC" s []
*AmbSys> let s' = Station "London" [a]
*AmbSys> let c = Crew "John Smith" a False
*AmbSys> let a' = Ambulance "ABC" s [c]
*AmbSys> let s'' = Station "London" [a']
*AmbSys> let system_state = SystemState [s''] [a'] [c]
*AmbSys> system_state
SystemState [Station {stName = "London", stAmbulances = [Ambulance {amCallSign = "ABC",
amStation = Station {stName = "London", stAmbulances = []}, amCrew = [Crew
{crName = "John Smith", crAmbulance = Ambulance {amCallSign = "ABC",
amStation = Station {stName = "London", stAmbulances = []}, amCrew = []},
crOnDuty = False}]}]}] [Ambulance {amCallSign = "ABC", amStation = Station {
stName = "London", stAmbulances = []}, amCrew = [Crew {crName = "John Smith",
crAmbulance = Ambulance {amCallSign = "ABC", amStation = Station {stName = "London",
stAmbulances = []}, amCrew = []}, crOnDuty = False}]}] [Crew {crName = "John Smith",
crAmbulance = Ambulance {amCallSign = "ABC", amStation = Station {stName = "London",
stAmbulances = []}, amCrew = []}, crOnDuty = False}]
आप पहले से ही समस्याओं की एक जोड़ी यहाँ देख सकते हैं:
- मैं एक सुसंगत SystemState बनाने में असमर्थ किया गया है - मूल्यों के कुछ ऐसे s या s के रूप में 'पुराने' मान के लिए 'कर रहे हैं, एस 'के बजाय।
- 'समान' डेटा के कई संदर्भों में अलग-अलग प्रतियां हैं।
अब मैं एक समारोह जो एक SystemState और एक क्रू सदस्य के नाम जो एक नई SystemState जहां कि चालक दल के सदस्य 'ऑफ ड्यूटी' है रिटर्न लेता है बना सकते हैं।
मेरी समस्या यह है कि मुझे एम्बुलेंस में चालक दल के सदस्य और सिस्टमस्टेट में क्रू सदस्य की समान प्रतिलिपि को ढूंढना और बदलना है।
यह छोटे सिस्टम के लिए संभव है, लेकिन वास्तविक प्रणालियों में कई और संबंध हैं। यह एक एन-स्क्वायर समस्या की तरह दिखता है।
मुझे बहुत पता है कि मैं किसी ऑब्जेक्ट उन्मुख तरीके से सिस्टम के बारे में सोच रहा हूं।
हास्केल में ऐसी प्रणाली को सही ढंग से कैसे बनाया जाएगा?
संपादित करें: अपने जवाब के लिए हर किसी के लिए धन्यवाद, और reddit पर उन बहुत http://www.reddit.com/r/haskell/comments/b87sc/how_do_you_manage_an_object_graph_in_haskell/
मेरे समझ अब है कि मैं चीजों को मैं हास्केल में चाहते हो सकता है लगता है। नकारात्मक पक्ष में, ऐसा लगता है कि संदर्भों की आवश्यक कमी के कारण, ऑब्जेक्ट/रिकॉर्ड/स्ट्रक्चर ग्राफ़ हास्केल में 'प्रथम श्रेणी' ऑब्जेक्ट्स नहीं हैं (क्योंकि वे सी/जावा/आदि में हैं)। वहाँ सिर्फ एक व्यापार बंद है - कुछ कार्य हास्केल में वाक्य रचना सरल कर रहे हैं, कुछ सी में सरल (और अधिक असुरक्षित) कर रहे हैं
धन्यवाद, जो आकस्मिक समस्याओं में से एक को बहुत अच्छी तरह से हल करता है। – fadedbee
मैं "कुंजी" को "न्यूटाइप कुंजी ए = कुंजी स्ट्रिंग व्युत्पन्न (ईक, ऑर्ड, शो)" के रूप में परिभाषित करता हूं। यह सिर्फ तीन अलग-अलग कुंजी प्रकारों के बीच पुनरावृत्ति की एक छोटी राशि बचाता है। –