2012-11-02 18 views
5

यह IO() मोनैड के साथ संभवतः एक हास्केल नया प्रश्न है।हैप्स्टैक एक पठन फ़ाइल प्रदर्शित करता है

मुझे Happstack.Server प्रोग्राम में एक फ़ंक्शन मिला है जो फ़ाइल अपलोड के लिए प्रतिक्रिया उत्पन्न करता है।

postFile = do methodM POST 
       decodeBody filePolicy 
       (tmp, name, meta) <- lookFile "upload" 
       ok $ concat ["A file! ", tmp, " || ", name, " || ", show meta] 

यह ठीक काम करता है। अब, मैं इसे अपलोड की गई फाइल की सामग्री के साथ-साथ इसके स्थानीय tempname, मूल नाम और सामग्री-प्रकार मेटाडेटा को प्रदर्शित करना चाहता हूं। मैं यह सोचते गया था कि सिर्फ

postFile = do methodM POST 
       decodeBody filePolicy 
       (tmp, name, meta) <- lookFile "upload" 
       contents <- readFile tmp 
       ok $ concat ["A file! ", tmp, " || ", name, " || ", show meta, "\n\n", contents] 

लेकिन है कि मुझे त्रुटियों की एक स्ट्रिंग मुझे बताने के लिए कुछ decodeBody कॉल के साथ है लगता है कि हाथ के बाद से यह एक do ब्लॉक में सभी जगह ले जा रहा है, मैं कर सकता।

... 
/home/inaimathi/projects/happstack-tutorial/parameters.hs:23:15: 
    No instance for (Happstack.Server.Internal.Monads.WebMonad 
         Response IO) 
     arising from a use of `decodeBody' 
    Possible fix: 
     add an instance declaration for 
     (Happstack.Server.Internal.Monads.WebMonad Response IO) 
    In a stmt of a 'do' block: decodeBody filePolicy 
    In the expression: 
     do { methodM POST; 
      decodeBody filePolicy; 
      (tmp, name, meta) <- lookFile "upload"; 
      contents <- readFile tmp; 
      .... } 
    In an equation for `postFile': 
     postFile 
      = do { methodM POST; 
       decodeBody filePolicy; 
       (tmp, name, meta) <- lookFile "upload"; 
       .... } 
... 

मुझे यकीन नहीं है कि यहां क्या गलत हो रहा है। क्या कोई मुझे शिक्षित कर सकता है?


EDIT3:

यही निष्कर्ष पर जाने के लिए मुझे जानेंगे।

अतिरिक्त त्रुटियों को मैं अनुचित रूप से स्थापित पुस्तकालयों के कारण था। मेरे ~/.ghc को साफ़ करना, फिर happstack इंस्टॉल करना फिर से तय किया गया।

+2

हैप्स्टैक को नहीं पता, लेकिन आपको शायद 'लिफ्टियो $ readFile tmp'' का उपयोग करने की आवश्यकता है। – hammar

+1

जैसा कि अन्य ने कहा है, आपको बस 'लिफ्टियो' की आवश्यकता है। मैं इस पर क्रैश कोर्स में एक सेक्शन जोड़ूंगा। – stepcut

उत्तर

11
No instance for (Happstack.Server.Internal.Monads.WebMonad 
         Response IO) 

अनुवाद: अपने do -block आईओ इकाई लेकिन कुछ अन्य इकाई नहीं है। सौभाग्य से, यह पता चला है MonadIO का एक उदाहरण होने के लिए:

class Monad m => MonadIO m where 
    liftIO :: IO a -> m a 

जैसा कि आप देख, ऐसे मामलों बस एक तरह से आईओ इकाई से 'लिफ्ट' आईओ कार्रवाई करने में ही है, तो आपके मामले में आप सिर्फ जरूरत है प्रदान करता है :

contents <- liftIO $ readFile tmp 

liftIO के कार्यान्वयन जाहिर m पर निर्भर करता है, लेकिन एक विशिष्ट इकाई ट्रांसफार्मर में यह lift और liftIO का उपयोग करता आईओ इकाई के अंदर करने के लिए ढेर; उदाहरण के लिए, implementations for the other monad transformers in the Transformers library देखें।

+0

इस सुझाव को आजमाने के बाद प्रश्न में एक संपादन जोड़ा गया; ऐसा लगता है कि यह 'लिफ्टियो' जोड़ने के समान सरल नहीं है। – Inaimathi

+0

पोस्टफाइल का प्रकार क्या है? – Fixnum

+0

'हैप्स्टैक। सर्वर। आंतरिक। मोनाड्स। सेवरपार्ट आईओ स्ट्रिंग' ('टीएच 'में' ghci' रिपोर्ट 'हैप्स्टैक। सर्वर। आंतरिक। मोनाड्स। सेवरपार्ट आईओ [चार]' – Inaimathi

संबंधित मुद्दे