2013-09-27 6 views
5

मेरी रिकॉर्ड (खेतों की बड़ी संख्या के साथ) मान लीजिए इस तरह परिभाषित किया गया है: a सेएक मूल्य में परिवर्तन के साथ नया रिकॉर्ड बनाएं

data Sample_Record = Sample_Record { record_field1 :: Int, 
            record_field2 :: Int, 
            record_field3 :: Float 
            } 

a = Sample_Record { record_field1 = 4, 
        record_field2 = 5, 
        record_field3 = 5.4 
        } 

मैं प्रकार Sample_Record का एक नया रिकॉर्ड बना सकते हैं है जो यह में से एक है क्षेत्र संशोधित?

+0

की [संभव डुप्लिकेट वहाँ है (f (C {a=a}) = a ही f (C {a}) = a के रूप में है) नेस्टेड डेटा संरचना को अद्यतन करने के लिए एक हास्केल मुहावरे?] (http://stackoverflow.com/questions/7365425/is-there-a-haskell-idiom-for-updating-a-nested-data- संरचना) –

उत्तर

10

हां। हमारे पास बहुत सारे तरीके हैं। सरल

foo b = b {record_field1 = 1} 

> foo a 
Sample_Record { record_field1 = 1,record_field2 = 5, record_field3 = 5.4 } 

हमारे पास कुछ एक्सटेंशन हैं। वाइल्डकार्ड NamedFieldPuns एक्सटेंशन के साथ पैटर्न में सभी रिकॉर्ड,

{-# LANGUAGE RecordWildCards #-} 
bar [email protected](Sample_Record {record_field1 = 1,..}) = b {record_field1 = 10} 
bar [email protected](Sample_Record {record_field1 = 2,..}) = b {record_field1 = 20} 

उपयोग करने के लिए नहीं हम अतिरिक्त बॉयलरप्लेट बिना मूल्यों के रूप में रिकॉर्ड क्षेत्रों इस्तेमाल कर सकते हैं अनुमति देते हैं

{-# LANGUAGE NamedFieldPuns #-} 
baz [email protected](Sample_Record {record_field1, record_field2, record_field3 = 0}) = 
    b{ record_field3 = record_field1 + record_field2 } 
संबंधित मुद्दे