मैं एक हास्केल रूकी हूं और मुझे अक्सर अपने सदस्य में से किसी एक को फ़ंक्शन लागू करने के लिए पैटर्न मिलान के साथ डेटा को विघटित करना पड़ता है और फिर उसे फिर से इकट्ठा करना पड़ता है।क्या हास्केल किसी फ़ंक्शन को डेटा सदस्य को मैप करने का तरीका प्रदान करता है?
मेरे पास है कहते हैं:
data Car = Car { gas :: Int, licensePlate :: String }
और मैं इसे अपने गैस को आधा करने के लिए जब यह ड्राइव, और यह फिर से ईधन देना चाहते हैं, तो मैं कर रहा हूँ:
mapGas:: (Int -> Int) -> Car -> Car
mapGas f (Car aGas aLicensePlate) = Car (f aGas) aLicensePlate
drive:: Car -> Car
drive = mapGas (flip div 2)
refuel:: Int -> Car -> Car
refuel = mapGas . (+)
सिर्फ करने के लिए एक रास्ता है कि सहायक फंक्शन mapGas को परिभाषित किए बिना? चूंकि यह कई क्षेत्रों के बने होने पर डेटा के प्रत्येक सदस्य के लिए नक्शा फ़ंक्शन लिखने के बजाय परेशान हो सकता है। मैं जानता हूँ कि यह accessors साथ सदस्यों में से एक के लिए एक मूल्य निर्दिष्ट करना संभव है:
runOutOfFuel:: Car -> Car
runOutOfFuel aCar = aCar { gas = 0 }
यह accessors भी साथ एक समारोह मैप करने के लिए संभव है? यदि हां, तो कैसे?
मुझे लगता है कि आप में से कुछ ध्यान देना चाहिए 'lens' ट्यूटोरियल https://hackage.haskell.org/package/lens – epsilonhalbe
बस रिकार्ड के लिए, लेंस के बिना, मुझे लगता है कि सबसे अच्छा आप कर सकते हैं' है mapGas च = (\ कार -> कार {गैस = एफ (गैस कार)}) '। यह कम से कम अन्य क्षेत्रों का जिक्र करने से बचाता है। – chi
@chi मैं आमतौर पर उन मामलों में जो करता हूं वह समरूपता को संरक्षित करने का प्रयास करता है: 'mapGas f = (\ car @ car {gas = g} -> कार {gas = f g}) '। लंबा, लेकिन आप '->' के दोनों किनारों पर 'गैस' फ़ील्ड देख सकते हैं। – Alec