簡體   English   中英

使用Template Haskell時,鍵入同義詞“not in scope”

[英]Type synonyms “not in scope” when using Template Haskell

使用Template Haskell時,我收到一個關於數據類型“不在范圍內”的奇怪錯誤。

這是我的Main.hs文件:

{-# LANGUAGE TemplateHaskell #-}

module Main where

import Control.Lens
import Data.Aeson
import Data.Aeson.TH

type Foo = Bar

data Baz = Baz
$(deriveJSON defaultOptions ''Baz)
-- $(makeLenses ''Baz)

data Bar = Bar

main :: IO ()
main = print "hello"

在嘗試編譯它時,我收到以下錯誤:

test-0.1.0.0: configure
Configuring test-0.1.0.0...
test-0.1.0.0: build
Building test-0.1.0.0...
Preprocessing executable 'test' for test-0.1.0.0...
[1 of 1] Compiling Main             ( Main.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.2.0/build/test/test-tmp/Main.o )

Main.hs:9:12:
    Not in scope: type constructor or class ‘Bar’

--  While building package test-0.1.0.0 using:
      /usr/bin/runhaskell -package=Cabal-1.22.2.0 -clear-package-db -global-package-db -package-db=/home/illabout/.stack/snapshots/x86_64-linux/nightly-2015-06-17/7.10.1/pkgdb/ /tmp/stack1699/Setup.hs --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.2.0/ build
    Process exited with code: ExitFailure 1

無論我使用deriveJSON還是makeLenses發生此錯誤。

如果我將type Foo = Bar行向下移動超過使用Template Haskell,則文件編譯正常。

是什么導致了這個錯誤?

這是一個.cabal文件和stack.yaml文件來編譯它:

test.cabal:

name:                test
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10

executable test
  main-is:             Main.hs
  build-depends:       base >=4.8 && <4.9
                     , aeson >= 0.8 && < 0.9
                     , lens >= 4 && < 5
  default-language:    Haskell2010

stack.yaml:

flags: {}
packages:
- '.'
extra-deps: []
resolver: nightly-2015-06-17

這是使用ghc-7.10.1。

這是由使用Template Haskell時的聲明組引起的。 以下是GHC手冊的摘錄:

頂級聲明拼接將源文件分解為退化組。 聲明組是由頂級聲明拼接創建的聲明組,以及它之后的聲明組,直到但不包括下一個頂級聲明拼接。 模塊中的第一個聲明組包括所有頂級定義,但不包括第一個頂級聲明拼接。

每個聲明組僅在組內相互遞歸。 聲明組可以引用先前組中的定義但不能在以后的 組中引用

在我的原始代碼中,創建了兩個聲明組:

-- This is the start of the first declaration group.

type Foo = Bar

data Baz = Baz
$(deriveJSON defaultOptions ''Baz)

-- This is the start of the second declaration group.

data Bar = Bar

第一個聲明組無法看到Bar ,這會導致此錯誤。

在模板Haskell之前移動data Bar = ...聲明,它將工作:

type Foo = Bar

data Baz = Baz
data Bar = Bar

$(deriveJSON defaultOptions ''Baz)
$(makeLenses ''Baz)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM