2013-05-13 26 views
7

このエラーの他の投稿を見直しましたが、私はこれらの間違いをしているとは思わないのです。Haskellエラー "範囲外:データコンストラクタ"

範囲外です:データコンストラクタ '抽出'。

Configuration.hs:

module Configuration 
(Config 
, columns 
, headers 
, types 
, totals 
, extractions, 
Extraction 
, xState 
, xDivisions 
, xOffice 
...) where 

... 

data Extraction = Extraction { xState  :: String 
          , xDivisions :: Maybe [String] 
          , xOffice :: Maybe String } deriving Show 


data Config = Config { columns  :: String 
        , headers  :: [String] 
        , types  :: [String] 
        , totals  :: [String] 
        , extractions :: [Extraction] } deriving Show 

... 

PIF.hs:

module PIF (...) where 

import Configuration 

... 

data Report = Report { division :: String 
        , state  :: String 
        , office :: String 
        , inSection :: Bool 
        , content :: [String] } deriving Show 

... 

extract :: Config -> [Report] -> [Report] 
extract c = filter f 
    where f Report { division=d, state=s, office=o, inSection=_, content=_ } = 
      map or $ map isMatch $ extractions c 
      where isMatch 
        | Extraction { xState=xS, xDivisions=Just xD, xOffice=Nothing } = s==xS && (map or $ map (==d) xD) 
        | Extraction { xState=xS, xDivisions=Nothing, xOffice=Just xO } = s==xS && o==xO 

あなたはより多くの情報が必要なら、私に教えてください。ありがとう。ここで

は私の修正extractです:

extract c = filter f 
    where f Report { division=d, state=s, office=o, inSection=_, content=_ } = 
      or $ map isMatch $ extractions c 
      where isMatch x = 
        case ((xDivisions x), (xOffice x)) of (Nothing, Just y) -> s==(xState x) && o==y 
                 (Just y, Nothing) -> s==(xState x) && (or $ map (==d) y) 
+0

このエラーは、式コンテキストでパターン構文を使用していたという事実もカバーしています。私は 'Extraction {xState = xS ...} 'を' case'ステートメントに変更しました。私は 'or'で間違った' map'を削除しました。 'または'はリストを減らし、それをマップしません。 –

答えて

14

変更Extraction(..)への輸出ラインExtraction

データのコンストラクタではなく型をエクスポートしています。あなたの型とコンストラクターが同じ名前を共有しているので、この場合は明らかではありません。

+0

聖なる牛!どうもありがとうございます!私は自分自身でそれを考え出すことは決してできませんでした。 :) –