मैं Cloud Haskell के साथ खेल रहा हूं। मैंने देखा है in the hackage documentation एक प्रकार का आवेदक इंटरफ़ेस है। लेकिन विशेष रूप से मुझे लगता है या निम्न हस्ताक्षर के साथ एक समारोह closurePure
लिखने के लिए कोशिश कर रहा हूँ:क्लाउड हास्केल - क्लोजर के लिए "शुद्ध" कैसे लिखें?
closurePure :: (Typeable a, Binary a) => a -> Closure a
यह मूलतः शुद्ध की एक सीमित संस्करण है।
जबकि Closure
डेटाप्रकार ही सार है, निम्नलिखित closure
प्रदान की:
closure :: Static (ByteString -> a) -> ByteString -> Closure a
तो मैं इस अब तक प्राप्त कर सकते हैं:
closurePure :: (Typeable a, Binary a) => a -> Closure a
closurePure x = closure ??? (encode x)
समस्या क्या डाल करने के लिए जहां ???
रों हो रहा है।
myDecode :: (Typeable a, Binary a) => Static (ByteString -> a)
myDecode = staticPtr (static decode)
लेकिन GHC docs on static pointers पढ़ने के बाद show
उदाहरण मेरे लिए सुझाव दिया है कि आप एक बाधा नहीं हो सकता है क्योंकि एक विवश समारोह एक Typeable
उदाहरण नहीं है:
मेरा पहला प्रयास के बाद किया गया था। इसलिए मैं काम करने की कोशिश की चारों ओर Dict
का उपयोग कर सुझाव:
myDecode :: Typeable a => Static (Dict (Binary a) -> ByteString -> a)
myDecode = staticPtr (static (\Dict -> decode))
लेकिन अब मैं गलत प्रकार है कि ऊपर closure
समारोह में फिट नहीं बैठता मिल गया है।
क्या closurePure
लिखने के लिए वैसे भी कुछ है (या क्या मैंने क्लाउड हास्केल डॉक्स में इसे याद किया है)? binary
सादा प्रकार Closure
एस को आवेदक इंटरफ़ेस का उपयोग करने के लिए आवश्यक लगता है, लेकिन मैं यह नहीं कर सकता कि इसे कैसे किया जाए।
ध्यान दें कि मैं यह कर सकता:
class StaticDecode a where
staticPtrDecode :: StaticPtr (ByteString -> a)
instance StaticDecode Int where
staticPtrDecode = static Data.Binary.decode
instance StaticDecode Float where
staticPtrDecode = static Data.Binary.decode
instance StaticDecode Integer where
staticPtrDecode = static Data.Binary.decode
-- More instances etc...
myPure :: forall a. (Typeable a, StaticDecode a, Binary a) => a -> Closure a
myPure x = closure (staticPtr staticPtrDecode) (encode x)
कौन सा अच्छा काम करता है लेकिन मूल रूप से मुझे हर Binary
उदाहरण के लिए एक उदाहरण दोहराने की आवश्यकता है। यह गन्दा लगता है और मैं एक और तरीका पसंद करेंगे।
क्या आप सुनिश्चित हैं कि 'myDecode = staticPtr (static decode) 'काम नहीं करता है? ऐसा लगता है कि आपने 'स्टेटिक डिकोड' बाधा के लिए 'बाइनरी' बाधा का व्यापार किया है, लेकिन आप कहते हैं कि यह काम कर रहा है। – 4castle
क्षमा करें, अंतिम कार्य को 'myPure'' कहा जाना चाहिए, न कि 'myDecode'। उम्मीद है कि अधिक समझ में आता है। लेकिन एक मायने में आप सही हैं, लेकिन 'स्टेटिकडेकोड' उदाहरण के अंदर मैं स्थिर (जो काम करता है) को कॉल कर रहा हूं लेकिन जब मैं बाइनरी इंस्टेंस से पहले 'डीकोड' लेता हूं तो स्थिर लागू होता है। मुझे अनुमान है (यह पूरी तरह से अनुमान है) कि 'स्टेटिकडेकोड' का प्रत्येक उदाहरण एक अद्वितीय स्थैतिक सूचक उत्पन्न करता है, इसलिए यह ठीक काम करता है। – Clinton