मैं हास्केल रिकॉर्ड सिंटैक्स के साथ कुछ असहज महसूस करता हूं


9

हास्केल सिंटैक्स की अधिकांश शुद्धता की सुंदरता है। लेकिन रिकॉर्ड सिंटैक्स बदसूरत दिखता है। यह असुविधाजनक है। यह सी के साथ किसी प्रकार के मिश्रण को महसूस करता है। इसके लिए कॉमा और ब्रेस की आवश्यकता होती है। हास्केल में टैब, लाइन आधारित पृथक्करण है। तो यह मूल रूप से इसकी आवश्यकता की तुलना में बहुत अधिक क्रियात्मक दिखता है। इसे इस तरह से क्यों बनाया गया है?


4
मेरे लिए हास्केल के सभी अजीब लगता है। मैं क्या कर सकता हूँ?
नौकरी

7
आप अकेले नहीं हैं। काफी लोगों को (वर्तमान अवतार) रिकॉर्ड के बारे में शिकायत है।

Eonil: यदि आप वास्तव में रिकॉर्ड सिंटैक्स से नफरत करते हैं, तो आप इसे {- # NoTraditionalRecordSyntax # -} GHC एक्सटेंशन के साथ अक्षम कर सकते हैं।
डैनियल डेयाज

जवाबों:


8

जब मैं डिज़ाइन कमिट पर नहीं था, तो मुझे लगता है कि रिकॉर्ड सिंटैक्स को सूची सिंटैक्स के अनुरूप होना चाहिए। मॉड्यूल एक्सपोर्ट सिंटैक्स कॉमा का उपयोग करता है, भी, एकमात्र वास्तविक स्थान जहां लेआउट का उपयोग किया जाता है, शीर्ष स्तर की घोषणाएं होती हैं, जहां क्लॉस और नोटेशन होते हैं।

उसके ऊपर, दिया गया

data Foo = Foo {bar :: Int, baz :: Int}

लिख रहे हैं

fnord x = x { bar = 4 }

ब्रेसिज़ के बिना वाक्य रचना के बाकी हिस्सों के साथ टकराव होगा, और लेआउट का उपयोग करना, जैसे

fnord x = x
    bar = 4

वाक्यविन्यास काफी भंगुर बना देगा। गलत जगह पर "जहां" जोड़ें और आपके कोड का मतलब कुछ अलग है।

यदि आप हास्केल में रिकॉर्ड्स की स्थिति से खुश नहीं हैं (और आप उसके साथ अकेले नहीं होंगे), तो मैं आपको सलाह देता हूं कि आप फीकैबल्स पर नज़र डालें या यहां तक ​​कि एचएलस्ट या ग्रेपफ्रूट -रिकॉर्ड्स (जैसे बाद के दो नहीं) के बारे में लिखें। दिल के बेहोश के लिए, लेकिन यह भी शक्तिशाली

fclabels आपको लिखने के लिए अनुमति देगा (yay पॉइंटफ्री)

fnord = setL bar 4

साथ ही साथ

getBar = getL bar

इसके शीर्ष पर वास्तविक राइसन डीट्रे है, जो लेबल की रचना कर रहा है:

 data Person = Person { _place  :: Place, ... }
 data Place = Place { _city :: String, ... }

 moveToAmsterdam :: Person -> Person
 moveToAmsterdam = setL (city . place) "Amsterdam"

हम्म। क्या setLमतलब है परस्पर? बिना आईओ के? आईटी को समझना मुश्किल ...
Eonil

2
बिलकुल नहीं, आप रिकॉर्ड की एक और (साझा) प्रतिलिपि प्राप्त करने जा रहे हैं, एक एकल फ़ील्ड के साथ, रिकॉर्ड सिंटैक्स की तरह। रेफरेंसियल ट्रांसपेरेंसी का कोई म्यूटेबिलिटी या ब्रेक नहीं।
बारसोई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.