मैं एक मॉड्यूल में निम्न कोड:खाका हास्केल: GHC चरण प्रतिबंध और कैसे काबू पाने के लिए
{-# LANGUAGE TemplateHaskell #-}
module Alpha where
import Language.Haskell.TH
import Data.List
data Alpha = Alpha { name :: String, value :: Int } deriving (Show)
findName n = find ((== n) . name)
findx obj = sequence [valD pat bod []]
where
nam = name obj
pat = varP (mkName $ "find" ++ nam)
bod = normalB [| findName nam |]
और फिर मैं मुख्य फ़ाइल में निम्न है:
{-# LANGUAGE TemplateHaskell #-}
import Alpha
one = Alpha "One" 1
two = Alpha "Two" 2
three = Alpha "Three" 3
xs = [one, two , three]
findOne = findName "One"
findTwo = findName "Two"
$(findx three) -- This Fails
$(findx (Alpha "Four" 4)) -- This Works
main = putStrLn "Done"
मैं था मेरे लिए findThree = findName "Three"
बनाने के लिए $(findx three)
की तरह। लेकिन इसके बजाय, मुझे यह त्रुटि मिलती है:
GHC stage restriction: `three'
is used in a top-level splice or annotation,
and must be imported, not defined locally
In the first argument of `findx', namely `three'
In the expression: findx three
मैं इसे कैसे दूर करूं? मुझे एक अलग फ़ाइल में one
, two
, आदि को परिभाषित करने की आवश्यकता नहीं है।
दूसरा प्रश्न यह है कि $(findx (Alpha "Four" 4))
समस्या के बिना काम क्यों करता है?
यदि आप उसी मॉड्यूल में किसी नाम को संदर्भित करने का प्रयास कर रहे हैं, तो आप इसे किसी भी तरह उद्धरण/अर्ध-उद्धरण के साथ करने में सक्षम हो सकते हैं? यदि आप एक splice में वास्तव में _execute_ करने की कोशिश कर रहे हैं, तो इसे भूल जाओ। संकलक मूल रूप से ऐसा नहीं कर सकता है। – MathematicalOrchid
ठीक है। '$ (Findx तीन)' और '$ (findx (अल्फा" चार "4) के बीच अंतर क्या है? पूर्व में वास्तव में त्रुटि में परिणाम होता है लेकिन बाद वाला काम करता है। – me2
'तीन' उसी मॉड्यूल में परिभाषित किया गया है, जबकि 'अल्फा' नहीं है। – yiding