2012-02-11 18 views
7

में जारी मैं निम्नलिखित कोड मॉड्यूल लोड और एक अभिव्यक्ति के प्रकार के प्राप्त करने के लिए GHC एपीआई का उपयोग करता है:कैसे संभाल करने के लिए "आतंक: असंभव हुआ" और हास्केल

typeObjects :: [String] -> [String] -> IO [Type] 
typeObjects modules objects = do 
    defaultErrorHandler defaultDynFlags $ do 
    runGhc (Just libdir) $ do 
     dflags <- getSessionDynFlags 
     setSessionDynFlags dflags 
     targets <- mapM ((flip guessTarget) Nothing) modules 
     setTargets targets 
     result <- load LoadAllTargets 
     case result of 
      Failed -> error "Compilation failed" 
      Succeeded -> do 
      m <- mapM (((flip findModule) Nothing) . mkModuleName) modules 
      setContext m [] 
      values <- mapM exprType objects 
      return values 

तो भाव डॉन ' टी टाइप चेक, पूरे कार्यक्रम के साथ दुर्घटनाग्रस्त:

TestDynamicLoad: panic! (the 'impossible' happened) 
    (GHC version 7.0.3.20110330 for x86_64-unknown-linux): 
    Couldn't match expected type `GHC.Types.Int' 
      with actual type `[GHC.Types.Char]' 

मैं इसे कैसे बना सकता हूं ताकि यह प्रोग्राम को क्रैश न करे? मैं सिर्फ यह जानना चाहता हूं कि कौन से अभिव्यक्ति प्रकार सफलतापूर्वक चेक किए गए थे और कौन नहीं था।

+4

यदि आप कंपाइलर को क्रैश करने में कामयाब रहे हैं, तो यह एक कंपाइलर त्रुटि है। जांचें कि यह एक ज्ञात बग है, अन्यथा इसकी रिपोर्ट करें। – Landei

+0

मुझे नहीं लगता कि यह एक बग है। यह सही है। मैंने रनटाइम पर एक अभिव्यक्ति को संकलित करने की कोशिश की जिसने एक स्ट्रिंग में पारित करने की कोशिश की जहां एक इंट की उम्मीद थी। मैं बस उस त्रुटि को "पकड़ना" चाहता हूं और अभिव्यक्ति को "चिह्नित" करना चाहता हूं, जबकि अन्य जो त्रुटि नहीं करते हैं, मैं सफल मानता हूं। – mentics

+10

@taotree एक त्रुटि की रिपोर्ट करना सही व्यवहार है। एक "दहशत" के साथ दुर्घटनाग्रस्त हो रहा है ('असंभव' हुआ) "सही व्यवहार नहीं है। इसे एक बग के रूप में रिपोर्ट करें। –

उत्तर

12

आप इसे संभाल नहीं सकते - यह कर्नेल 'ओप्स' की तरह है, और इसका मतलब है कि रनटाइम या कंपाइलर असंगत स्थिति में है। इसे एक बग के रूप में रिपोर्ट करें।

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