[英]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.